1. 程式人生 > >動態分配的記憶體在程序結束後會被作業系統回收嗎?

動態分配的記憶體在程序結束後會被作業系統回收嗎?

首先答案是:會。

這是當時在華為培訓班的時候遇到的一個問題。很多同學本著C++沒有記憶體回收的理論認為不會被回收。而我本著作業系統設計的時候就會考慮到這一點,所以大多數現代作業系統一定會回收。這是一個需求決定的機制,而不是由於語言的限制。但是有個持有錯誤觀點的同學是清華的,我迫於學術崇拜,以及對自己實力的不自信,沒有很好的堅持自己的觀點,而是保留了疑問。

我是這樣分析的:

1.作業系統是對於硬體的抽象。也就是說再沒有作業系統的時候程式直接和機器打交道,而有了作業系統以後程式以為是很機器打交道,其實是在和作業系統打交道。程式申請的每一個作業系統的空間都是作業系統基於的虛擬地址。這也是在大三的時候我寫的文章裡面說程式自以為獨佔了機器,而作業系統是冥冥中的上帝之手。而確實是有很多的刻畫小說吧人的夢境和白天的時間寫成分時複用給不同的世界也是這個思路,扯遠了。

2.一個程序結束以後,還保留著其記憶體空間,這樣的機制是計算機使用者不希望看到了,也沒有什麼用途。當然這裡指的是使用者級別的應用。所以作業系統不會設計成這個樣子

後來通過我查資料發現

每一個程序都執行在一個獨立的4GB“地址空間”當中 

這個4G只是邏輯上的,實體記憶體不可能有這麼多,
這個“地址空間”中,核心佔掉了高位的2G, 使用者就用低位的2G 了,用malloc 來管理
在使用者程式的堆中分配一個指定大小的空間,並告訴系統的記憶體管理模組:“我要使用這塊空間!” 
那麼,系統的記憶體管理模組究竟做了些什麼呢?
熟悉Intel 80x86程式設計的人應該容易理解,它其實只做一件事:把應用程式的虛擬地址空間對映到真實的實體地址(或者磁碟上的分頁檔案) 
所以說,不管使用者程式怎麼malloc,在程序結束的時候,其虛擬地址空間就會被直接銷燬,作業系統只需要在程序結束的時候
讓記憶體管理模組把分頁檔案中與此程序相關的記錄全部刪除,標記為“可用空間”,
就可以使所有申請的記憶體都一次性地回收,根本沒有什麼麻煩.
簡單說,malloc 的分配都是假的,malloc 的請求系統都知道,程式退出時,系統會回收malloc 的所有資源。
但是,有些記憶體系統是回收不了的。
例如運行於核心級的驅動造成的記憶體錯誤等, 這些是系統所管不了的。
這種錯誤,重啟程式是沒有效果的。必須重啟電腦才能解決。
http://blog.csdn.net/hejinjing_tom_com/article/details/38561677
後來通過查資料發現這個博主的文章更加詳細,而且在理。
而我在遇到矛盾糾紛的時候就缺少這種穩定下來思維而後娓娓道來的素質。這是需要我提高的地方。
1.需要對理論知識足夠的熟悉,並且經驗中遇到過很多的問題。
2.擁有有道理講道理,娓娓道來,繪聲繪色,不喜不悲的素質。
3.增加自己的自信,很多時候心裡總是依賴,其實在自己可以確定的地方是可以自信一下的,無論對方是誰。前提是按照前兩點講出你的道理。