簡體   English   中英

我的程序調試期間是否可能導致內存泄漏?

[英]Can I cause memory leaks during debug of my program?

我正在開發Ubuntu 9.10

我正在編寫一個C程序,在我的測試和調試期間,我正在調用malloc並且總是記得調用free() - 這顯然只是在調試期間。

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

我很感激解釋。

謝謝你,馬克西姆。

是的,操作系統將在程序停止運行時回收分配給程序的所有內存。

你是對的。

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

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

內核在內核的內存中有一組進程記錄,並跟蹤每個進程,消耗的內存量,諸如i / o,文件句柄或inode等資源。 進程記錄通常保存在一個隊列中,其中內核的任務指針以永無止境的方式指向進程記錄(這解釋了為什么“多任務”的感知,它正在眨眼之間 - 這么快,實際上,它是在內核眼中進行單任務)。 進程記錄中有一個字段,用於說明所述進程占用了多少內存。

是的,內核確實將內存恢復到自己的池中,以備另一個進程使用。 此外,正如John Weldon上面指出的那樣,對於內存泄漏,你絕對是100%正確的。 我在另一個帖子中提到了這一點,因為每個malloc都有一個免費的,如果你沒有內存泄漏的話。 所以不要擔心你的調試會話。 這完全沒問題,因為內核有責任確保內存被回收。

某些應用程序(尤其是守護程序)必須徹底調試,並且不會發生內存泄漏,因為守護程序將在下次重新引導之前運行很長時間。 順便提一下,在我最喜歡的書“專家C編程,深度C秘密 - 彼得范德林登”中提到過,在他進入Sun的一個階段,有一個名為“printtool”的工具用於打印,但每隔一段時間隊列堵塞,因為打印后台處理程序中存在內存泄漏,並且Sun機器的重新啟動使其固化,他詳細描述了與內存泄漏有關的問題。

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

許多舊的Unix應用程序嚴重泄露內存,並依賴於進程結束清理。 即使在那些日子的有限地址空間中,它通常也能很好地工作。 當然,這不適用於長時間運行的應用程序。 調試時我不擔心內存泄漏的影響(泄漏本身就是bug,因此你需要在發布之前刪除它們)。

在Unix中以及我實際熟悉的所有其他當前操作系統中發生的事情是操作系統為進程分配內存。 malloc()從進程內存中獲取內存,如果它要求超過進程可以提供的內容,則會從操作系統請求更多的進程內存。 如果程序有內存泄漏,那么進程內存可以增長到系統允許的大小,但它是所有進程內存,並且當進程結束時所有分配都會消失。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM