2011-08-07 88 views
5

是有一些方法來運行終止代碼,不管是什麼樣的終止(異常,正常,未捕獲的異常等)? 我知道它實際上可能在Java中,但它甚至可能在C++中?我假設一個Windows環境。關閉掛鉤C++

+2

它是不可能在Java中任 - 不管語言的所有進程不能趕上Linux(和Windows上的等效)信號-9或當信號到達 – Soren

+0

由於@Drake建議運行任何代碼,我會去[的atexit](http://www.cplusplus.com/reference/cstdlib/atexit/)。 –

回答

5

否 - 如果有人調用TerminateProcess,你的進程將沒有進一步的告別破壞,(尤其是)沒有任何機會,在運行任何代碼關閉過程。來解決這個問題

+1

這是正確的答案;然而正如其他一些答案所指出的那樣,你可以使用'atexit()'設置一個退出處理程序,並且你可以使用'signal()'來捕獲大多數信號 - 但是如果有人強迫終止,你永遠不會採取任何行動將殺-9在Linux和信號9是抓不到) – Soren

+0

謝謝你,其實我是怕的answere – Paranaix

+0

也:斷言(),中止(),終止() –

2

對於正常閉合applciation我建議

atexit() 
1

的一個好方法是使用C++ RAII成語,其在此是指清理操作可以放置在對象的析構函數,即

class ShutdownHook { 
    ~ShutdownHook() { 
    // exit handler code 
    } 
}; 

int main() { 
    ShutdownHook h; 
    //... 
} 

參見ACE庫Object Lifetime Manager。在鏈接的文檔中,他們也討論了atexit函數。

+0

我在上文中假設的出口是「正常「,即不通過例如'退出()'呼叫,或由於分段故障等。 –

+1

小心。這不能保證工作。如果一個異常轉義了main(),那麼在實現中定義了堆棧是否展開。因此,要保證這個工作,你必須捕獲main()中的所有異常(將你的代碼放在try塊中)。你不需要做任何事情,只需重新拋出異常後的字眼。 –

0

不爲任何類型的終止;有些信號被設計爲不能被處理,比如Linux上的KILL。

這些信號被設計用來終止佔用了所有內存或CPU,或其他一些資源的程序,並已離開的狀態,使得它難以運行的處理函數的計算機。