2016-04-26 49 views
2

cppreference abort,我們有自動變量abort()不可避免的調用有什麼可能的影響?

析構函數,線程局部和靜態存儲持續時間不叫。傳遞給std :: atexit()的函數也不會被調用。是否關閉文件等開放資源是實現定義的。

我對的術語和矛盾有點糊塗中止術語,「關閉」我的計劃,並從功能,它說,析構函數和開放的資源可能不叫的描述/關閉,分別。那麼,是否有可能我的程序仍在運行,並且在調用abort()之後仍然有一些內存泄漏或資源仍然打開?

+0

可能不是一個確切的笨蛋,但可以幫助理解:http://stackoverflow.com/questions/397075/what-is-the-difference-between-exit-and-abort – Tas

+1

程序不能同時中止並繼續運行,這是一個矛盾。由於它在中止後不存在,它也不會泄漏內存 - 這在運行時是相關的。可能發生的情況是其他外部資源沒有被正確清理(如臨時文件等) –

+0

@DanMašek:re「由於它在中止後不存在,它也不能泄漏內存」,所以沒有連接從前提到結論,對不起。通用計算機仍採用現代操作系統,內存通常被回收。 –

回答

2

這就像殺了一個人。他們將沒有機會支付任何未付帳單,組織他們的遺產,清理他們的公寓等。

是否發生這種情況取決於他們的親屬或其他第三方。

因此,通常像打開文件這樣的東西會被關閉,並且沒有內存會因爲操作系統照顧到這個問題而泄漏(就像警察或其他人將空置公寓時一樣)。有些平臺不會發生這種情況,例如16位窗口或嵌入式系統,但在現代Windows或Linux系統下,它會好的。

但是,絕對不會發生的是析構函數運行。這就好比讓被殺害的人在他們的日記上寫下最後一個條目並加以密封 - 只有這個人自己知道如何去做,而且當你沒有警告地殺死他們時,他們就不會這樣做。因此,如果有什麼重要的東西應該在析構函數中發生,它可能會產生問題,但通常不會很明顯 - 它可能是某種程序在某處創建了臨時文件並通常在退出時將其刪除,現在它不能和該文件保持不變。

但是,您的程序將被關閉,不再運行。它只是沒有機會清理乾淨的東西,因此取決於操作系統做正確的事情並清理它所使用的資源。

+0

該死的,這個答案爲我澄清了所有...其他人也。謝謝大家! –

4

傳遞給std :: atexit()的函數也不會被調用。是否關閉文件等開放資源是實現定義的。

這意味着實現可以決定發生了什麼。在任何常見的客戶操作系統上,當您的流程退出時,與您的流程相關的大多數對象都會被銷燬。這意味着您不會泄漏與new分配的內存,或者打開文件。

可能有不常見的對象沒有被釋放 - 例如,如果你有一個共享內存塊,它可能會留在另一個進程試圖訪問它。或者,如果您創建了一個臨時文件,打算稍後將其刪除,現在該文件將保留在那裏,因爲您的程序不會將其刪除。

2

在Unix上,調用abort()可以有效地向您的進程傳遞一個SIGABRT信號。內核在交付信號時的默認行爲是關閉進程,可能留下核心文件並關閉任何描述符。您的流程的控制線程被完全刪除。請注意,這一切都發生在C++(或任何其他語言)的任何概念之外。這就是爲什麼它被視爲實施定義。

如果您想更改默認行爲,您需要安裝一個信號處理程序來捕獲SIGABRT。

+1

這在技術上是最徹底的答案。 – CherryDT

相關問題