2010-11-30 20 views
5

Quel sera le statut d'un pointeur d'objet lorsqu'un nouveau constructeur de classe lancera une exception en C++? Prenez le code suivant par exemple:Statut du pointeur d'objet après l'apparition d'un nouveau constructeur - C++

CMyClass * pobjMyClass = (CMyClass *)0xA5A5A5A5; 

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

Lorsque ce code est exécuté quelle sera la valeur de pobjMyClass être, après l'exception est levée? Un pointeur vers une instance non valide de CMyClass, 0xA5A5A5A5, NULL, une valeur non initialisée aléatoire ou autre chose? Merci.

+0

Vous l'avez sûrement déjà essayé? – TonyK

+2

@TonyK, en essayant les choses ne fournit que la moitié de la réponse - comment cela fonctionne sur * votre * compilateur. Il est souvent utile de savoir comment cela fonctionne universellement. C++ est plein d'embûches, et il est bon d'être prudent. –

+0

Même ainsi, Mark - sûrement Jim l'a essayé? Qu'est-il arrivé? – TonyK

Répondre

6

Étant donné que l'exception est levée avant que l'affectation n'ait lieu, pobjMyClass sera ce qu'elle était auparavant - dans votre cas, 0xa5a5a5a5.

+0

+ 1 de supprimer le mien parce que vous avez obtenu la bonne réponse en premier :) –

+0

Eh bien, techniquement, il était un peu idiot de ma part de poster une nouvelle réponse, même si la vôtre était annotée dans les commentaires et parfaitement bien après l'édition. Mais merci :) – EboMike

+4

Pour être plus précis, il existe un point de séquence à la sortie du constructeur, ce qui signifie que l'effet secondaire de l'assignation ne peut avoir lieu avant le retour du constructeur. Puisque le constructeur ne revient pas, l'assignation ne se produit jamais. – aschepler