2013-02-20 81 views
1

如果我在執行過程中分配了一些內存,但從未調用delete並且程序終止,會發生什麼情況?操作系統是否可以釋放我分配的所有內存,並且內存不會「浪費」?或者,在計算機重新啓動之前,是否會丟失部分內存?如果我不'刪除'會發生什麼?

很明顯,我知道很好的編碼習慣是確保你刪除你不需要的東西,所以我不只是問「delete有什麼意義」;我只是想知道我的RAM內發生了什麼。

+0

釋放您的內存,以便操作系統可以再次使用它。當你的程序終止時,所有的內存將被自動釋放,但是,它值得釋放,所以在你的進程的整個生命週期內,內存的使用將保持較低的內存佔用。 – RageD 2013-02-20 18:32:28

+0

謝謝,這正是我以爲發生的事情。 – user3728501 2013-02-20 18:32:53

+2

問題之一,你應該......忘記它。只是...新的和刪除。總是。總是!總是! – gaussblurinc 2013-02-20 18:35:17

回答

4

這一切都取決於你的程序做了什麼,它使用多少內存 - 在任何給定的時間和整個運行時間。

舉例說,你寫一個郵件服務器,它分配內存來保存它收到的每封郵件。但實際上並不需要存儲通過它發送的每封電子郵件。因此,在接收和轉發電子郵件幾天之後,郵件服務器不能分配更多內存,它已經佔用了內存中的所有可用字節 - 但實際上它並沒有對內存做任何有用的操作,因爲電子郵件不再被使用 - 他們已經得到處理。另一方面,如果我們編寫我們的郵件服務器程序來分配一個緩衝區來讀取電子郵件,處理它,當它完成時,內存被重新用於另一封電子郵件,那麼沒有什麼意義了永遠釋放那個記憶。

如果我們編寫一個只讀取文件的程序,將整個文件加載到內存中,並且爲統計目的計算所有字母時,打印統計信息並退出,無論是否分配大量內存並不重要。

當然,所有這一切都假定撥打new是簡單的分配內存。如果對象的構造函數做了更復雜的事情,比如打開一個文件,獲取一個鎖或其他東西,那麼如果不調用析構函數,很快就會發生各種各樣的壞事。操作系統將(對於常用操作系統,如Linux,MacOS,iOS,其他Unix系統,Windows,DOS,OS/2等)釋放您的應用程序使用的內存。

7

從概念上講,你泄漏內存。

實際上,雖然,如果你有一個理智的操作系統,它很可能會在你的過程後清理。但不要依賴那個,真的。

0

當進程終止時,操作系統釋放分配給進程的所有內存。所以一旦程序終止,程序分配的內存將被操作系統釋放並回收。

+2

對於使用虛擬內存管理器的操作系統而言,這僅僅是一種情況 - 目前使用的操作系統大部分都是這樣 - 但它不適用於某些實時操作系統。 – Void 2013-02-20 18:37:04

相關問題