2013-01-10 17 views
7

Wenn ein unique_ptr wie folgt initialisieren:std :: unique_ptr :: zurückgesetzt und Konstruktor Ausnahmen

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

aber eine Ausnahme von Foo::Foo() geworfen wird, ist die Frage: Was tun mit dem Speicher geschieht verteilt? Wie verhindert unique_ptr das Auslaufen? Ist das etwas in new Operator behandelt?

Der Destruktor wird sicherlich aufgerufen, wenn der Bereich beendet wird. Da der reset Aufruf nicht aufgerufen wird, bis new Foo() zurückgibt, scheint es, dass dies von new gehandhabt werden muss, indem der reservierte Speicher freigegeben wird, wenn die Ausnahme den Konstruktor verlässt.

Passiert das?

+0

Siehe http://stackoverflow.com/questions/4094996/what-happen-to-the-memory-allocated-by-new-if-the-constructor-throws – Jon

Antwort

10

Wenn im Konstruktor Foo eine Ausnahme ausgelöst wird, wird die reset-Funktion des eindeutigen Zeigers nie an erster Stelle ausgeführt. Somit behält der eindeutige Zeiger seinen ursprünglichen Wert bei.

Ein new Ausdruck verliert Speicher nicht, wenn die Objektkonstruktion eine Ausnahme auslöst.

+0

Und wenn Sie 'make_unique' haben, kann man Verwenden Sie 'i = make_unique ()'. – GManNickG

+0

Und was ist mit 'std :: unique_ptr p = new Bla();' – Nick

+0

@Nick: Was ist damit? Hast du es versucht? –

Verwandte Themen