2013-10-29 10 views

risposta

14

Questo è perfettamente definito e ben educati. Tutti gli oggetti secondari completamente costruiti vengono distrutti se l'inizializzazione di un oggetto termina con un'eccezione, in ordine inverso rispetto alla loro costruzione. Questo è lo stesso per gli array come per gli oggetti di tipo definito dall'utente (si pensi alle classi e ai membri della classe).

Formalmente, abbiamo C++ 11 15,2/2:

Un oggetto di qualsiasi durata di conservazione di cui inizializzazione o distruzione viene terminato da un'eccezione avrà avere distruttori eseguite per tutti gli oggetti secondari completamente costruite (esclusi i membri variante di una classe union-like), cioè per oggetti secondari per i quali il costruttore principale (12.6.2) ha completato l'esecuzione e il distruttore non è ancora iniziato l'esecuzione.

+0

+1 Ebbene sì, grazie signore! L'ordine * di distruzione non specificato e lasciato all'implementazione? (L'ordine [in questo esempio] (http://ideone.com/BHZWo4) è interessante per me. – WhozCraig

+0

@WhozCraig: No, l'ordine deve essere specificato (pensa a cose più recenti che si riferiscono a cose più vecchie) Fammi vedere se riesco a trovare una dichiarazione formale –

+0

Ok. Grazie. Non riesco a vederlo * non * specificato * da qualche parte * È di grande dettaglio per gli oggetti automatici in-scope o membri di qualche oggetto, quindi lo penserei anche qui. – WhozCraig

9

Per § 5.3.4/8:

Una nuova espressione ottiene stoccaggio per l'oggetto chiamando una funzione allocazione (3.7.4.1). Se la nuova espressione termina da un'eccezione, essa può rilasciare stoccaggio chiamando una funzione deallocazione (3.7.4.2). Se il tipo allocato è un tipo non-array , il nome della funzione di allocazione è nuovo operatore e il nome della funzione di dealazione è l'eliminazione dell'operatore. Se il tipo assegnato è un tipo di matrice, il nome della funzione di allocazione è operatore nuovo [] e il nome della funzione di deallocazione è operatore delete [].

Saranno cancellati poiché la funzione di deallocazione invocherà i distruttori.

 


So appoggiato al ouput del compilatore non è la fiducia-in grado, ma è almeno una buona osservazione: Live Test

+3

La questione non era circa di stoccaggio, si trattava di elementi distruttori. – sharptooth

+11

Spesso faccio una pausa per intraprendere il significato più profondo di "maggio", specialmente in una frase come * che *. – WhozCraig

+1

Non una funzione di deallocazione (ad esempio 'delete') richiama il distruttore ?! – deepmax

Problemi correlati