2009-12-09 13 views
10

Assumere il seguente codice:Userà nuove eccezioni di maschera (std :: nothrow) generate da un costruttore?

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

'p' sarà uguale a 0, se siamo fuori di memoria heap.

Cosa succede se siamo NON memoria esaurita ma il costruttore di Foo lancia? Quella eccezione sarà "mascherata" dalla versione nothrow di 'new' e 'p' impostata a 0? ... Oppure l'eccezione generata dal costruttore di Foo lo farà uscire dalla funzione?

risposta

16

No, non lo sarà. L'nothrow si applica solo alla chiamata a new, non al costruttore.

12

Il costruttore di 10 può ancora generare eccezioni e queste verranno interrotte.

Il costruttore non viene chiamato fino a dopo l'allocazione della memoria.

6

Ho appena provato. L'eccezione passa. Se si esegue il codice seguente:

#include <new> 

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


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

    return 0; 
} 

poi si ottiene il seguente output (su Linux comunque):

terminate called after throwing an instance of 'int' 
Aborted 

Così, l'eccezione effettivamente ottenere attraverso nonostante il nothrow.

Problemi correlati