簡體   English   中英

析構函數拋出異常

[英]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();
}

C ++常見問題解答

在堆棧展開期間,所有那些堆棧幀中的所有本地對象均被破壞。 如果這些析構函數之一拋出異常(例如,它拋出了Bar對象),則C ++運行時系統處於不贏局面:它應該忽略Bar並最終到達} catch(Foo e){何去何從? 它應該忽略Foo並尋找} catch(Bar e){處理程序嗎? 沒有好的答案-任何選擇都會丟失信息。

因此,C ++語言保證此時將調用Terminate(),並且Terminate()終止進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM