[英]Destructor throwing exception
我試圖理解為什么析構函數拋出異常是一個非常糟糕的主意。 通過谷歌搜索,我理解如果析構函數在塊范圍對象的破壞期間拋出,則對象的破壞停止,並且如果存在析構函數未要求的其他對象,則會導致內存泄漏。
但是,就其本身而言,析構函數拋出異常是如此糟糕嗎? 例如(完整示例):
struct A
{
int a;
char b;
A() : a(10), b('a') { }
~A(){ throw std::exception(); }
};
int main()
{
A a; //destructor throws, but there're no more objects to destruction
//therefore I think there's no memory leak
}
我們在上面的程序中得到UB了嗎?
在這個簡單的示例中,拋出了bar()中的異常,並且堆棧未展開,從而破壞了a,從而引發了另一個異常。 在這種情況下可以拋出哪個異常?
struct A
{
int a;
char b;
A() : a(10), b('a') { }
~A(){ throw std::exception(); }
};
void bar ()
{
A a;
throw std::exception();
}
int main()
{
bar();
}
在堆棧展開期間,所有那些堆棧幀中的所有本地對象均被破壞。 如果這些析構函數之一拋出異常(例如,它拋出了Bar對象),則C ++運行時系統處於不贏局面:它應該忽略Bar並最終到達} catch(Foo e){何去何從? 它應該忽略Foo並尋找} catch(Bar e){處理程序嗎? 沒有好的答案-任何選擇都會丟失信息。
因此,C ++語言保證此時將調用Terminate(),並且Terminate()終止進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.