2011-08-14 26 views
16

可能重複:
Will exit() or an exception prevent an end-of-scope destructor from being called?調用exit()時析構函數是否運行?

在C++中,當應用程序調用出口(3)應該在堆棧上的析構函數將要運行展開棧?

+0

而且,還有其他方法嗎?拋出一個特殊的類型,而不是調用'exit',在'main'中捕獲它,然後''''返回''而不是從'main'退出''''。 –

+1

@AaronMcDaid我不明白你的問題。替代方法是什麼?你會通過避免調用exit()來完成什麼?在我的一個應用程序中,我會拋出一個'customExit'對象並將其捕獲到main中,並使用'customExit'對象中的整數值來提供main的返回值,這樣我的RAII析構函數就可以清理臨時文件。 – WilliamKF

+0

你的評論完全回答了我的(嚴重寫作)問題。謝謝!基本上,我想確認,其他人使用這個'throw'辦法,以確保一切正常程序退出 –

回答

28

不,大部分析構函數都不在exit()上運行。

C++ 98§18.3/ 8討論了這一點。

本質上,當調用exit時,靜態對象被銷燬,atexit處理程序被執行,打開的C流被刷新並關閉,tmpfile創建的文件被刪除。本地自動對象不被破壞。也就是說,沒有堆棧展開。

調用abort讓更少發生:無論如何都不會清理。

+0

對於誰不想要清理髮生的人,_exit()可能是更好的通話超過中止(),因爲中斷會提高SIGABRT信號,通常導致的行爲頗爲相似崩潰。 –

5

如果你的操作系統是合理的(UNIX,LINUX,還是最新的Windows),調用exit()告訴內核去分配所有進程的內存。堆棧不需要解開;它將會不復存在。

+13

而在堆棧析構任何RAII代碼被破壞將不會被調用。如果僅處理私有進程的內存,這可能無關緊要;但如果涉及(a)需要刪除或重命名或以其他方式清理的文件,以及(b)共享內存中的進程之間共享的數據結構的完整性,則該問題很重要。 //出於這些原因,有些項目禁止使用exit,並且/或者重新定義了exit()來拋出異常,導致堆棧解除。 –

相關問題