L’utilisation de nouvelles exceptions (std :: nothrow) masquera-t-elle un constructeur?

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.