如果在對象的構造函數中拋出異常,那麼析構函數會被調用嗎?或者它是不確定的行爲? (這就是爲什麼我不願意說我的編譯器做什麼。)在構造函數中拋出的異常:析構函數是否被調用?
struct foo()
{
foo(){
throw "bar";
}
~foo(){
/*am I called*/
}
};
foo f;
如果在對象的構造函數中拋出異常,那麼析構函數會被調用嗎?或者它是不確定的行爲? (這就是爲什麼我不願意說我的編譯器做什麼。)在構造函數中拋出的異常:析構函數是否被調用?
struct foo()
{
foo(){
throw "bar";
}
~foo(){
/*am I called*/
}
};
foo f;
析構函數將不會被調用,因爲foo
對象沒有被認爲是完全建立,直到一個構造函數執行完畢(注意,這意味着如果你拋出一個委託給不同構造函數的構造函數,然後將調用的析構函數)。從構造函數中拋出不是未定義的行爲。
對象的生命週期從其構造函數完成其執行時開始。這意味着,在構造函數執行結束之前,該對象從不存在。所以,沒有活的對象,因此,沒有析構函數可以調用。
因此,沒有未定義的行爲,除非創建異常對象引發另一個異常。在這種情況下,程序中斷。但是,在異常之前完全構造的任何其他對象都會被適當地破壞,包括基本子對象,其他成員對象,在引發異常的函數的相同範圍內聲明的本地對象,以及之前範圍的任何其他對象, t趕上那個例外。
檢查出來,堆棧展開(在stackoverflow,谷歌和維基百科,按照優先順序)。
這個答案似乎收縮quantdev的 –
@YogiBear這個答案是正確的。幸運的是,你很容易測試自己。 – Simple
我做了測試,但我從老闆那裏繼承了「未定義行爲」的緊張情緒! –