2013-04-08 44 views
6

假設我將某些內存malloc分配給某些指針,但在程序退出之前不釋放它們。這個內存是否在退出時自動釋放,或者內存泄漏是否會繼續存在,直到我重新啓動計算機?當程序退出時,堆是否被釋放?

+1

通過[this](http://stackoverflow.com/questions/2215259/will-malloc-implementations-return-free-ed-memory-back-to-the-system)和[this](http: //stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc)。 – 2013-04-08 15:10:07

回答

5

答案是最常見的。

釋放堆是操作系統的責任。儘管大多數操作系統(特別是主流操作系統)在退出時釋放堆棧,但嵌入式系統操作系統並非一定如此。

當您調用要在堆上分配的內存時,系統會調用OS的內核空間來提供此內存。該內存映射到由OS維護的進程結構。當程序退出時,操作系統會執行清理路由,關閉所有文件描述符,並將該內存空閒分配給其他進程(等等)。

其中一些答案在說它是依賴於編譯器的時候是不正確的。編譯器不會說'嘿,釋放程序退出時的所有這些內存'。這沒有意義,如果操作系統意外終止程序,會發生什麼?不,編譯器負責生成系統調用,無論何時明確請求堆的內存分配/解除分配。

1

當進程退出時,任何現代桌面操作系統都會回收資源。不會有內存泄漏。

2

內存不會被您的程序或libc釋放,但會被所有現代操作系統上的操作系統釋放。他們將內存分配給特定進程,並在進程終止時清理內存。

+0

並非所有的操作系​​統都會這樣做。 – 75inchpianist 2013-04-08 16:04:26

1

這取決於您使用的操作系統。顯然,任何現代的桌面操作系統都可以在你的程序退出時清除,如果有必要的話。

1

如果你看看C標準,它是特定於實現的,所以你不能確定這一點。

但是一旦進程終止,大多數操作系統將釋放內存,但在一些更小/更簡單的平臺上可能不是這種情況。

1

這不是一個c問題。如何實現堆取決於編譯器以及程序退出後的操作系統。據我所知,當一個程序退出時,所有現代操作系統都是免費的內存資源某些嵌入式系統或驅動程序可能不適用。

+0

程序退出後如何釋放堆與編譯器無關。這是一個操作系統問題。 – 75inchpianist 2013-04-08 15:06:52

+0

是的,這就是我想說的。但不好。編譯器對如何實現堆進行了一些說明。你可以在沒有虛擬地址空間或內存管理的Os上有C程序。在所有現代植入方式中,編譯器都會將調用轉發給系統調用,但這不一定是這種情況 – rerun 2013-04-08 15:09:54

相關問題