2009-12-09 12 views
10

Angenommen, den folgenden Code:Werden neue (std :: nothrow) Maskenausnahmen von einem Konstruktor ausgelöst?

Foo* p = new (std::nothrow) Foo(); 

'p' wird gleich 0, wenn wir aus dem Heap-Speicher sind.

Was passiert, wenn wir NICHT nicht genügend Speicher, aber Foo Konstruktor wirft? Wird diese Ausnahme durch die Notversion von 'new' und 'p' auf 0 maskiert? ... Oder wird die Ausnahme, die aus Foos Konstruktor geworfen wird, aus der Funktion entfernt?

Antwort

16

Nein, wird es nicht sein. Die nothrow gilt nur für den Aufruf an new, nicht an den Konstruktor.

12

Foo 's Konstruktor kann immer noch Ausnahmen auslösen und sie fallen durch.

Der Konstruktor wird erst aufgerufen, nachdem der Speicher zugewiesen wurde.

6

Ich habe es gerade versucht. Die Ausnahme kommt durch. Wenn Sie den folgenden Code ausführen:

#include <new> 

class Foo 
{ 
public: 
    Foo() 
    { 
     throw 42; 
    } 
}; 


int main() 
{ 
    Foo* foo = new(std::nothrow) Foo; 

    return 0; 
} 

dann erhalten Sie die folgende Ausgabe (auf Linux sowieso):

terminate called after throwing an instance of 'int' 
Aborted 

Von daher ist die Ausnahme in der Tat trotz der nothrow durchkommen.

Verwandte Themen