2011-04-10 69 views
19

退出程序時,如果我使用malloc在我的C程序分配的內存,現在我要退出需要分配的內存,我必須釋放分配的內存,或者我可以假設,因爲我的整個程序終止,它將被操作系統釋放?正在釋放用C

我在Linux環境下運行。

+2

我問出來的純粹的好奇心和理解內存分配和OP的工作更好,我保證所有有關應答者(那些誰回答),我會永遠免費的我分配的內存。 – SIMEL 2011-04-10 13:59:42

+0

[當你在malloc之後不自由時會發生什麼?](http:// stackoverflow。com/questions/654754/what-really-happen-when-you-dont-free-after-malloc) – Mark 2013-05-12 13:24:33

回答

19

任何現代操作系統都會在進程終止後清理所有的東西,但依賴於此通常不是一個好習慣。

這取決於你正在編寫的程序。如果它只是一個快速運行和終止的命令行工具,那麼您可能不會打掃清理。但請注意,正是這種思維模式導致了守護進程和長時間運行的程序中的內存泄漏。

+0

我完全明白你的觀點,但我不同意「當我的進程退出時不清理內存」的思維方式會導致長時間運行的程序泄漏。不管它運行多長時間,OS都會在退出時清理它。 「懶惰清理」肯定會導致內存泄漏,但這不是問題。不釋放記憶的決定應該是有意識的和謹慎的。 – Dan 2017-07-14 15:58:09

2

操作系統將回收內存,因此您無需將其釋放。

大多數程序做免費的內存,但因爲如果你不釋放那麼任何內存,你容易有由這些有意地泄漏問題。

+1

顯然downvoter不同意! – 2011-04-10 13:47:01

+0

downvote是從我。但是我可以發誓,那時我只有第一句話。我現在將添加的句子拿回來,但除非再次進行編輯或其他方式,否則它會被鎖定。任何建議都讚賞如何在更改後立即刪除downvote。根據同樣的原因,在這個主題下降了第二個(現在刪除的)答案,順便說一句。 – 0xC0000022L 2011-04-10 14:17:03

+0

@status如果你願意,你現在可以改變你的投票。第一句話有什麼問題?這是真的你不知道嗎?! – 2011-04-10 14:24:38

3

在任何情況下,它都會在進程終止時被操作系統釋放。所以你不需要它,但是因爲這是一個很好的習慣,爲什麼你不這樣做呢? :)其實有複雜的代碼

我不會的風險不釋放一些東西,我不知道在100%,因爲程序退出後,將是無用的。所以對於任何最小的疑問,只要解放它。

2

是的,你可以假設。

雖然這是一個很好的做法,取消分配不需要後立即對它的記憶,即使對於只有很短的時間運行的軟件。

0

OS將回收內存,但它是很好的做法,免費的東西,如果你希望他們會在你面前跑出來的範圍malloc的東西。但是,您可以或多或少地依靠程序的終止來處理內存管理。

1

Linux將釋放分配的內存並關閉進程終止時的文件描述符。

1

總是釋放您分配的內存,因爲操作系統將毫無理由地佔用更少的內存。在小型操作系統中這一點非常引人注目,它的內存很小。

+0

這是一個糟糕的答案,它沒有解決實際的問題,即關於從Linux進程退出時是否釋放內存。它由操作系統釋放,在退出之前明確地釋放所有內存,毫無意義地減慢並使程序複雜化。 – 2011-04-12 08:57:49

8

它可以是一個很好的設計和非常高效的簡單退出並允許操作系統清理一切。 Apple OS X now does this by default:除非應用程序設置了「不要殺我」標誌,否則應用程序會在不通知的情況下被殺死。

通常情況下,釋放每個內存分配需要花費大量時間。某些內存頁面可能已被換出,並且必須重新讀入,以便將它們標記爲空閒。內存分配器必須做很多工作來更新空閒內存跟蹤數據。所有這些努力都是浪費,因爲該計劃正在退出。

但是這必須通過設計來完成,而不是因爲程序員失去了分配內存的軌道!

+0

Upvoted爲您的最後一句話,這是最重要的一點。 – Dan 2017-07-14 15:59:15