2011-06-12 3 views
7

Lors de l'écriture C++, supposons que la ligne de code suivante:NULL dans une instanciation

Object* obj = new Object(); 

Si cette ligne deux compiles et ne provoque pas d'exceptions ou d'autres visibles problèmes d'exécution, peut obj être juste NULL après la ligne a été exécutée?

Répondre

14

Non, obj ne peut pas être NULL.

Si new échoue, il lancera une exception std::bad_alloc. Si aucune exception a été levée, obj est garanti pour pointer vers une instance entièrement initialisés de Object.

Il existe une variante de new qui ne jette pas une exception

Object *obj = new(nothrow) Object(); 

Dans ce cas, obj sera NULL si new échoue, et l'exception std::bad_alloc ne sera pas jeté (si le constructeur de l » de Object peut évidemment encore jeter des exceptions).

Sur certains compilateurs plus anciens, new peut ne pas générer d'exception et renvoyer plutôt NULL à la place, mais ce comportement n'est pas conforme aux normes.

Si vous avez surchargé operator new, il pourrait se comporter différemment en fonction de votre mise en œuvre.

+0

Ou à moins que vous ayez fait quelque chose comme '#define new new (nothrow)' peut-être? ;) –

+0

@Karl Knechtel: C'est un comportement non défini – Puppy

+0

Que se passe lorsque vous compilez sans exception? Utilisera-t-il automatiquement la version nothrow? –

2

Non, sauf si vous avez désactivé les exceptions ou surchargé std::new pour faire autre chose que le standard (qui renvoie std::bad_alloc en cas d'échec).

(Je ne sais pas comment std::new se comporte lorsque des exceptions sont désactivées, mais une discussion à ce sujet est disponible here ...)

+1

La norme ne définit pas comment les nouvelles se comporte lorsque des exceptions sont désactivées, car la norme ne définit pas un monde où des exceptions peuvent être désactivées. C'est à la mise en œuvre de chaque compilateur individuel. –

4

Non, votre ligne exacte ne peut pas se comporter comme ça. obj pointera toujours vers la mémoire valide si aucune exception n'est levée. La ligne suivante, cependant, retournera 0 si la mémoire ne pouvait être attribuée:

Object* obj = new (std::nothrow) Object(); 
3

new lancers francs std::bad_alloc est l'allocation n'a pas été sucessful. Donc, vous devriez attraper cette exception.
Vous devez utiliser nothrow nouveau si vous voulez être vérifier pour NULL après new.