2010-04-19 56 views
17

比方說,我有以下代碼:退出()或異常會阻止調用結束範圍的析構函數嗎?

struct mytype 
{ 
    ~mytype() { /* do something like call Mix_CloseAudio etc */ } 
}; 

int main() 
{ 
    mytype instant; 

    init_stuff(); 

    start(); 

    return 0; 
} 

那是析構函數保證即使exit()時從某處內部使用的start()被調用?

+2

異常將調用析構函數,'exit()'不會。 – falstro 2010-04-19 14:20:38

+0

不完全是這種情況,但我得到的析構函數在Linux上使用GCC調用*靜態對象*。 – 2015-05-19 18:54:38

回答

21

如果您致電exit,則不會調用析構函數。

從C++標準(§3.6.1/ 4):

在調用<cstdlib>(18.3)中聲明的函數

void exit(int); 

終止程序,而不必離開當前因此不會破壞具有自動存儲時間的任何物體(12.4)。如果在銷燬具有靜態存儲持續時間的對象期間調用exit來結束程序,則程序具有未定義的行爲。

16

是,調用exit()指的析構函數將不會被調用:

調用函數void出口(INT); <cstdlib>(18.3) 聲明當前程序段不離開 程序終止程序,因此沒有 銷燬任何具有自動 存儲持續時間(12.4)的對象。如果退出是 調用結束程序在 銷燬對象與靜態 存儲持續時間,該程序有 未定義的行爲。

如果拋出異常,另一方面析構函數將被調用。這是C++中異常安全的基礎。

3

只要程序中的內容捕獲到異常,異常就會調用析構函數。如果異常退出main()函數而未被捕獲,則標準不要求運行時展開堆棧以進行清理。

main()功能使用

try{ 
    // code 
}catch(...){ //that elipsis should actually appear in your code 
      //it doesn't mean I omitted code here. 
    //code 
} 

將保證每一個異常被捕獲,並且所有的析構函數被調用。

相關問題