感謝所有的響應C++:處理資源,如果構造函數可能會拋出異常(參考FAQ 17.4]
我重新格式化我的問題,瞭解成員指針的狀態下,方含類構造函數拋出異常後
。再我的例子類:)
class Foo
{
public:
Foo()
{
int error = 0;
p = new Fred;
throw error; // Force throw , trying to understand what will happen to p
}
~Foo()
{
if (p)
{
delete p;
p = 0;
}
}
private:
Fred* p;
};
int main()
{
try
{
Foo* lptr = new Foo;
}
catch (...)
{}
}
類FOO的consturctor會拋出一個異常,爲一些隨機的原因。我知道foo的desturctor永遠不會被調用,但在這種情況下,p的析構函數會被調用嗎?
它使p作爲boost智能指針而不是fred的原始指針有什麼區別。
謝謝。
這是我的錯。請原諒我沒有正確格式化我的問題。 我想了解,如果容器類的構造函數由於某些隨機原因而失敗,是否會調用成員指針的析構函數。 也有什麼區別,它使p作爲升壓智能指針比fred的原始指針。 – mithuna 2009-08-04 23:39:19
如果Foo的構造函數的主體拋出,則將調用Foo所有成員的析構函數。然而,成員p是一個Fred *,指針的「析構函數」從不做任何事情(相當於:它們沒有析構函數,我不記得確切的語言)。所以它是否被稱爲是沒有實際意義的問題。 Fred的析構函數不會被調用。如果p是一個shared_ptr,那麼可以通過'new'成功創建Fred,然後使用p的構造函數拋出。在這種情況下,Fred類的析構函數將被shared_ptr的構造函數調用,作爲其合約的一部分。 – 2009-08-04 23:59:25