2010-11-30 4 views
5

Quale sarà lo stato di un puntatore oggetto quando un nuovo costruttore di classi genera un'eccezione in C++? Prendere il seguente codice, ad esempio:Stato puntatore oggetto dopo che il nuovo costruttore genera eccezioni - C++

CMyClass * pobjMyClass = (CMyClass *)0xA5A5A5A5; 

try 
{ 
    pobjMyClass = new CMyClass(); // Exception thrown in constructor 
} 
catch (...) {} 

Quando questo codice viene eseguito quale sarà il valore di pobjMyClass essere, dopo l'eccezione viene generata? Un puntatore a un'istanza non valida di CMyClass, 0xA5A5A5A5, NULL, un valore casuale non inizializzato o qualcos'altro? Grazie.

+0

Sicuramente ci hai provato? – TonyK

+2

@TonyK, provare le cose fornisce solo la metà della risposta - come funziona su * il tuo * compilatore. Spesso è utile sapere come funziona universalmente. Il C++ è pieno di insidie, ed è bello essere prudenti. –

+0

Anche così, Mark - sicuramente Jim l'ha provato? Quello che è successo? – TonyK

risposta

6

Poiché l'eccezione viene lanciata prima che l'assegnazione abbia luogo, pobjMyClass sarà qualunque cosa fosse prima - nel tuo caso, 0xa5a5a5a5.

+0

+1 eliminando il mio perché in realtà hai ottenuto la risposta giusta :) –

+0

Beh, tecnicamente è stato un po 'strano da parte mia pubblicare una nuova risposta anche se la tua era stata annotata nei commenti e perfettamente corretta dopo la modifica. Ma grazie :) – EboMike

+4

Per essere più precisi, c'è un punto di sequenza all'uscita del costruttore, il che significa che l'effetto collaterale del compito non può avvenire prima che il costruttore ritorni. Poiché il costruttore non restituisce, l'assegnazione non avviene mai. – aschepler