2009-12-04 22 views
2

我在我的測試&在Ubuntu 9.10我的程序在調試過程中是否會導致內存泄漏?

我正在寫一個C程序,開發調試我調用malloc和永遠記住調用free() - 這顯然只是調試過程中。

我很好奇:我吃了空閒的內存系統有哪個調試會話?或者,在我從IDE關閉應用程序後,內核是否清理進程內存?邏輯推理我很確定內核知道被殺的整個進程,並知道它分配了什麼內存,因此即使應用程序沒有釋放內存,內存仍然被釋放。

我希望有一個解釋。

謝謝, Maxim。

回答

7

是的,OS停止運行時,將回收分配給程序的所有內存。

2

你是對的。

這不是一個嚴重的問題,因爲一旦您正在調試的程序被終止,任何'泄漏'的內存就會立即釋放。

當進程長時間運行時,內存泄漏通常只是一個問題。

+0

這是否意味着在短時間運行的應用程序泄漏內存是好的?它使內存泄漏的聲音比實際更無害。 – pmr 2009-12-04 14:48:42

+0

它總是情景化的,而不是黑色/白色,但通常情況下,除非內存泄漏非常嚴重,否則在短時間運行的程序中不會太嚴重。 – 2009-12-04 14:54:30

+1

事情是,你永遠不知道你爲短期應用程序編寫的代碼是如何在一年後使用的。 – shoosh 2009-12-04 14:58:46

2

內核在內核內存中有一組進程記錄,並跟蹤每個進程,消耗的內存量,I/O,文件句柄或inode等資源。進程記錄通常保存在一個隊列中,內核的任務指針以永無止境的方式指向進程記錄(這就解釋了爲什麼「多任務」的感知,它正在做一個眨眼 - 如此之快,真的,它是在內核的眼中做單一任務)。在過程記錄中有一個字段,告訴過程中有多少內存被咀嚼。

是的,內核確實獲取內存回自己的池,供其他進程使用。此外,正如John Weldon所指出的,你對於內存泄漏絕對是100%正確的。我在另一個posting中提到過,對於每個malloc都有一個免費的,如果沒有內存泄漏的話。所以不要擔心你的調試會話。這完全沒問題,因爲內核有責任確保內存被回收。

一些應用程序(特別是守護進程)必須徹底調試,並且不會發生內存泄漏,因爲守護進程將在下次重新啓動之前長時間運行。順便提一下,在我最喜歡的書「Expert C Programming,Deep C Secrets - Peter Van Der Linden」中提到過,在Sun的一個階段,有一個叫printtool的工具用於打印,但每隔一段時間由於在打印假脫機程序中存在內存泄漏,並且Sun機器的重新啓動解決了它,所以隊列被阻塞,他詳細描述了與內存泄漏有關的內容。

希望這會有所幫助, 最好的問候, 湯姆。

1

許多舊的Unix應用程序嚴重泄漏內存,並依賴於進程結束清理。即使在那些日子裏有限的地址空間裏,它通常也運行得很好。當然,這對長時間運行的應用程序無效。我不擔心在調試時內存泄漏的影響(泄漏本身就是錯誤,所以你需要在釋放之前刪除它們)。

在Unix中以及我真正熟悉的所有其他當前操作系統中發生的事情是OS將內存分配給進程。 malloc()將內存從進程內存中抽取出來,如果它要求超過進程可以提供的請求,將從操作系統請求更多的進程內存。如果程序發生內存泄漏,進程內存可能會增長到系統允許的程度,但這些都是進程內存,當進程結束時,所有分配都將消失。

我知道有一些操作系統沒有從終止的進程中恢復內存,但是我還沒有看到一個操作系統。用於個人計算機的唯一操作系統(與專用或企業計算機相對)有相當數量的人使用Windows和Unix變體,並且這些操作系統將在該過程結束時釋放所有內存。

相關問題