Supposons le code suivant:
Foo* p = new (std::nothrow) Foo();
«p» sera égal à 0 si nous n’avons plus beaucoup de mémoire.
Qu’est-ce qui se passe si nous ne sums pas à court de mémoire, mais le constructeur de Foo jette? Cette exception sera-t-elle “masquée” par les versions nothrow de ‘new’ et ‘p’ définies sur 0? … ou l’exception levée du constructeur de Foo la fera-t-elle disparaître de la fonction?
Non, ce ne sera pas. Le nothrow
s’applique uniquement à l’appel de new
et non au constructeur.
Le constructeur de Foo
peut toujours lancer des exceptions qui échoueront.
Le constructeur n’est appelé qu’après la mémoire allouée.
Je viens d’essayer. L’exception passe à travers. Si vous exécutez le code suivant:
#include class Foo { public: Foo() { throw 42; } }; int main() { Foo* foo = new(std::nothrow) Foo; return 0; }
alors vous obtenez la sortie suivante (sous Linux quand même):
terminate called after throwing an instance of 'int' Aborted
Donc, l’exception passe malgré tout malgré le nothrow.