2010-07-23 54 views
11

我的程序(文本模式的Web瀏覽器)動態分配內存。我應該在異常終止時釋放分配的內存嗎?

當然,我在運行時會釋放不需要的塊。在正常的終止之前,我確實釋放了所有的東西 - 這樣內存泄漏檢查器就不會給我帶來誤報(如果需要進行重大的重構,請靈活處理)。

現在,我做了什麼不是做是在異常終止之前釋放內存。 (目前,我的程序終止的信號,未能mallocs/reallocs後)。

我的問題是:你認爲這種不良作風?我應該釋放異常終止嗎?

+0

當您的進程終止時,您的系統將回收內存,不是嗎? – 2010-07-23 10:13:26

回答

12

不,我認爲這是完全可以接受的只是扔了你的手,讓操作系統回收內存的程序結束之後。我認爲,如果這確實是一種不正常的情況,並且意圖是讓程序終止,那麼一個行爲良好的程序應該簡單地清理所有磁盤資源/鎖,並儘快退出。

4

在我看來,釋放內存崩潰是沒有必要的。當你的進程終止時,OS將回收內存,所以你所要做的就是退出。

在另一方面,其他資源(例如打開的文件)應該被關閉或至少衝洗 - 因爲緩衝如果沒有,它們可能不被存儲/保存不完整的。

0

的過程異常終止不會導致不能被其他進程使用(有效地意味着它們是免費的)的內存塊,如果他們被分配它。

我們使用OS-指令,以便非馬車OS跟蹤MEM塊用於每個進程的並將它們轉換成一個連續虛擬內存空間分配/釋放存儲器。在進程死亡後,OS加載程序發出信號,所有內存都被調用。當進程共享內存時情況變得複雜。

凝視的過程,如果沒有衍生/啓動/由你處理分叉(例如考慮爲許多進程訪問多媒體資源的外部組件),可能有創建的存儲器(例如,緩衝器),以滿足您的過程。取決於這些外部組件的所有權策略,這個內存在服務進程死亡時可能不是免費的。

我建議您嘗試審覈在異常終止情況之前和之後提交的所有內存。

0

僅當您的操作系統在程序終止時不回收內存時。 DOS和它的「粘性內存」就是這種操作系統的一個例子。對於大多數現代操作系統來說,不是免費的()異常終止是不成問題的。

+0

DOS在程序終止時不會回收什麼樣的內存? – unbeli 2010-07-23 10:48:16

+0

Hrm。你確定這是真的嗎? – Gian 2010-07-23 10:52:29

+0

我確定至少有一個MSDOS和CP/M的BDOS變體是真的 - 它們支持所謂的「粘滯內存」,程序可以分配空間,並且即使在它終止後仍保持分配。此外,MSDOS中的TSR調用也取得了類似的結果,但我不認爲它是「異常終止」。 – 2010-07-23 11:04:44

0

不,除非你的程序總是異常終止。 :) 無論如何,操作系統做了一個很好的工作釋放它。實際上,許多懶惰的程序員甚至不會用正常的終止來解放事物 - 但這使得檢測其他內存泄漏變得困難(那些是真正的問題)。

3

您不需要需要在正常終止時回收內存,除非避免泄漏檢測工具中的誤報。

如果您的程序異常終止,根據原因,您可能會發現您的不能空閒內存。例如,由堆損壞導致的SIGSEGV意味着即使試圖釋放堆中的其他東西也許是無望的練習。

0

異常終止時,您希望儘可能少地處理異常終止。最大限度地減少中止過程的修補將意味着你可以儘可能接近中止的原因,並且任何進一步的處理可以被看作是「污染」過程,從而使其更難以調試。