假設我將某些內存malloc分配給某些指針,但在程序退出之前不釋放它們。這個內存是否在退出時自動釋放,或者內存泄漏是否會繼續存在,直到我重新啓動計算機?當程序退出時,堆是否被釋放?
回答
答案是最常見的。
釋放堆是操作系統的責任。儘管大多數操作系統(特別是主流操作系統)在退出時釋放堆棧,但嵌入式系統操作系統並非一定如此。
當您調用要在堆上分配的內存時,系統會調用OS的內核空間來提供此內存。該內存映射到由OS維護的進程結構。當程序退出時,操作系統會執行清理路由,關閉所有文件描述符,並將該內存空閒分配給其他進程(等等)。
其中一些答案在說它是依賴於編譯器的時候是不正確的。編譯器不會說'嘿,釋放程序退出時的所有這些內存'。這沒有意義,如果操作系統意外終止程序,會發生什麼?不,編譯器負責生成系統調用,無論何時明確請求堆的內存分配/解除分配。
當進程退出時,任何現代桌面操作系統都會回收資源。不會有內存泄漏。
內存不會被您的程序或libc釋放,但會被所有現代操作系統上的操作系統釋放。他們將內存分配給特定進程,並在進程終止時清理內存。
並非所有的操作系統都會這樣做。 – 75inchpianist 2013-04-08 16:04:26
這取決於您使用的操作系統。顯然,任何現代的桌面操作系統都可以在你的程序退出時清除,如果有必要的話。
如果你看看C標準,它是特定於實現的,所以你不能確定這一點。
但是一旦進程終止,大多數操作系統將釋放內存,但在一些更小/更簡單的平臺上可能不是這種情況。
這不是一個c問題。如何實現堆取決於編譯器以及程序退出後的操作系統。據我所知,當一個程序退出時,所有現代操作系統都是免費的內存資源某些嵌入式系統或驅動程序可能不適用。
程序退出後如何釋放堆與編譯器無關。這是一個操作系統問題。 – 75inchpianist 2013-04-08 15:06:52
是的,這就是我想說的。但不好。編譯器對如何實現堆進行了一些說明。你可以在沒有虛擬地址空間或內存管理的Os上有C程序。在所有現代植入方式中,編譯器都會將調用轉發給系統調用,但這不一定是這種情況 – rerun 2013-04-08 15:09:54
- 1. pthread_mutex_t *在程序中止或退出時是否釋放?
- 2. 程序退出時泄漏的內存是否釋放?
- 3. 當線程堆棧使用的內存被釋放時
- 4. 退出應用程序時,是否必須釋放指針或自動完成?
- 5. 當JVM退出時,本機屏幕資源是否自動釋放?
- 6. 是否有退出android應用程序後釋放硬件加速的內存。
- 7. 當應用程序關閉時內存不被釋放
- 8. ARC UIViewController從堆棧彈出時未被釋放
- 9. pthread_detach是否釋放分配給子線程的堆棧,在子線程退出之後
- 10. 當輸入鍵被按下時退出程序
- 11. 當Java進程退出時,由JNI DLL使用的內存是否被使用?
- 12. 當KeyDown.Event被提出時退出Sub
- 13. 程序退出後,CRITICAL_SECTION對象是否被回收?
- 14. 當IF語句== true時退出程序?
- 15. 退出應用程序時,當按下
- 16. 這段代碼是否被釋放?
- 17. 如何檢查android.hardware.Camera是否被釋放?
- 18. 檢查對象是否被釋放
- 19. 查詢實例是否已被釋放
- 20. 檢查HTML按鈕是否被釋放
- 21. JVM/GC是否在程序/線程退出時調用`finalize()`?
- 22. 當Android資源被釋放?
- 23. 何時釋放指針在C和如何知道它是否被釋放
- 24. C++堆棧內存未被釋放
- 25. 當Android應用程序自行退出時,AS3是否有一個事件?
- 26. 一旦指針超出範圍,內存是否會被釋放?
- 27. 當assert()失敗時,程序退出代碼是什麼?
- 28. 當系統重新啓動時,信號量是否會被刪除(或釋放)?
- 29. android應用程序在退出時沒有正常釋放藍牙
- 30. 當按下後退按鈕時退出應用程序
通過[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