2013-01-05 58 views
1
class ScopedShit 
{ 
public: 
    ScopedShit() { 
     cout << "ScopedShit()" << endl; 
    } 
    ~ScopedShit() { 
     cout << "~ScopedShit()" << endl; 
    } 
}; 

void foo() 
{ 
    ScopedShit ss; 
    int x = 0; 
    int y = 5/x; 
} 

int main() 
{ 
    __try { 
     foo(); 
    } 
    __except(true) { 
     cout << "Continuing..." << endl; 
    } 
} 

輸出:異常處理程序不調用析構函數

ScopedShit()

繼續...

我讀這篇文章http://www.codeproject.com/Articles/2126/How-a-C-compiler-implements-exception-handling這解釋:

但在它(異常處理程序)調用catch塊(它知道從funcinfo結構中捕獲 塊的地址,參見圖4)之前,它必須執行堆棧 展開:清除低於此的函數的堆棧幀 函數的框架。清理堆棧框架涉及到很好的 錯綜複雜:異常處理程序必須找到所有本地對象 函數在異常時處於活動狀態,並調用 它們的析構函數。

我錯過了什麼嗎?

回答

3

我相信你需要在編譯時指定/EHa SEH異常來調用C++析構函數。

如果未指定/ EH時,編譯器將捕獲結構和C++異常,但不會破壞C++對象,將走出去的範圍作爲異常的結果。

有關詳細信息,請參見MSDN

+0

非常感謝! – prgDevelop