2013-01-10 44 views
7

如果初始化一個unique_ptr這樣的:的std :: ::的unique_ptr復位和構造異常

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

但異常是從Foo::Foo()拋出,問題是:與記憶發生了什麼分配呢? unique_ptr如何避免泄露?這是在new運營商內部處理的東西嗎?

當範圍退出時,析構函數肯定會被調用。由於reset調用不會被調用,直到new Foo()返回,似乎這個必須由new處理,當異常離開構造函數時釋放分配的內存。

這是怎麼回事?

+0

請參閱http://stackoverflow.com/questions/4094996/what-happens-to-the-memory-allocated-by-new-if-the-constructor-throws – Jon

回答

10

如果在構造函數Foo中引發了異常,那麼該唯一指針的reset函數從不首先執行。因此,唯一指針保持其原始值。

A new如果對象構造拋出異常,表達式不會泄漏內存。

+0

如果您有'make_unique',則可以使用'i = make_unique ()'。 – GManNickG

+0

另外呢'std :: unique_ptr p = new Bla();' – Nick

+0

@Nick:那又怎麼樣?你試過了嗎? –