2013-01-10 6 views
7

Se inizializzare un unique_ptr come questo:std :: :: unique_ptr azzerati e le eccezioni costruttore

std::unique_ptr<Foo> i; 
i.reset(new Foo()); 

ma viene generata un'eccezione dal Foo::Foo(), la domanda è: cosa succede con la memoria allocata? come fa unique_ptr a evitare che venga trapelato? è qualcosa gestito all'interno dell'operatore new?

Il distruttore verrà chiamato quando si esce dall'ambito. Poiché la chiamata reset non viene richiamata fino a new Foo() resi, sembra che questo debba essere gestito da new, liberando la memoria allocata quando l'eccezione lascia il costruttore.

E 'questo che succede?

+0

Vedere http://stackoverflow.com/questions/4094996/che-happens-to-the-memory-allocated-by-new-if-the-constructor-throws – Jon

risposta

10

Se viene generata un'eccezione nel costruttore di Foo, la funzione reset del puntatore univoco non viene mai eseguita in primo luogo. Quindi il puntatore unico mantiene il suo valore originale.

Un'espressione new non perde memoria se la costruzione dell'oggetto genera un'eccezione.

+0

E se si dispone di 'make_unique', si può usa 'i = make_unique ()'. – GManNickG

+0

Inoltre, per 'std :: unique_ptr p = new Bla();' – Nick

+0

@Nick: che ne pensi? L'hai provato? –