2013-05-07 116 views
3

正如我們所知,堆用於爲應用程序動態分配內存。在應用程序異常終止的情況下,堆內存如何被清除(從而避免內存泄漏)?應用程序突然關閉時的堆內存清除

考慮以下方案:

  • 說,一個應用程序崩潰突然在Windows或Linux。
  • 我們強制在linux中殺死一個應用程序:kill -9 <process_name>
  • Visual Studio中的C++程序在執行過程中拋出一個錯誤。

是堆管理和清理在上述情況下,有什麼不同? [請添加更多的用例場景,這可能是準備在這裏]

這個問題在我腦海裏想出了,因爲我們總是在談論保證沒有內存泄漏發生在我們的代碼。現在我們如何處理那些強制關閉可能導致程序退出的應用程序而不調用內存釋放調用的場景。

如果這種內存泄漏重複發生,操作系統是否可能缺少堆內存?抑或是OS具有處理它的方式...

回答

1

至於動態內存管理,你應該使用RAII智能指針就是一個例子)拍攝期間的異常等保健內存泄漏和管理。
在您的應用程序退出的情況下,操作系統只是回收它提供給進程的所有內存。操作系統不理解泄漏,它只是收回它給過程的東西。所以本身沒有泄漏。所有內存都被回收。您可能會泄漏其他資源(文件描述符等),但聰明地使用RAII應該防範這種情況。

+0

感謝您的意見。我忽略了一個明顯的問題,即每個進程都提供了一個單獨的堆空間。 – vishal 2013-05-08 01:38:56

+0

實際上,我已經研究過一個實時操作系統,每個進程沒有單獨的heapspace(因爲如果在跨越進程邊界時必須分配並釋放每條消息,堆中發送消息會變得麻煩,所以它更好爲[一組進程或所有進程]擁有一個共同的堆棧)。它以每個進程爲基礎跟蹤分配的內存,當進程退出/死亡時,它將釋放屬於該進程的所有內存。所需要的是操作系統跟蹤所有內存分配,而不是堆屬於進程。 – 2013-05-08 08:56:20

0

不要緊,你的過程是如何關閉,從進程分配的任何剩餘的內存由操作系統的內存管理器它關閉時釋放。在你的進程死亡之前釋放你分配的所有內存是一個很好的習慣,但是當你的進程關閉時,OS /其他應用程序的可用堆是相同的。

6

假設操作系統是UNIX或Windows的典型實現,當應用程序被殺死了,無論用什麼方法是通過殺死堆內存是由操作系統釋放。

有意思的是,其他操作系統可能不會這樣做,這取決於每個操作系統以有意義的方式解決這個問題 - 我不知道有任何操作系統不會「在殺死進程後清理」,但我相信這樣的事情可能存在於這個世界的某個角落。

編輯:可能有其他資源不太容易被釋放,例如多個使用的共享內存或信號量。但是大多數操作系統傾向於通過釋放被殺應用程序的引用來處理這些問題,並讓等待任何「可等待對象」(互斥體,信號量等)的其他進程將「讓其運行」。

+3

作爲一個方面說明,析構函數不會被調用,因此如果在析構函數中有一些關鍵代碼(例如緩存到文件的緩衝區),可能會導致可怕的情況。 – Fabien 2013-05-07 12:14:45

+0

是的,編寫文件後半部分的代碼的後半部分可能還沒有運行...... 「zip」寫入大部分壓縮文件,但不包含位於文件末尾的「目錄」......如果代碼崩潰或死亡[沒有「捕獲」失敗],則結果是「不完整的」 「和」未定義「。 – 2013-05-07 12:18:09

+0

@Mats:感謝您的輸入。你的回答很有幫助。 – vishal 2013-05-08 01:39:55

2

「的堆典型地由運行時分配在應用程序啓動,並且當所述應用程序(技術上過程)離開被回收」,以便殺死/關閉一個應用程序異常/常不會泄漏的任何存儲器。

相關問題