學習linux內核之前一直對“內存泄漏”有這么一個認識,就是程序申請了一段內存后,即使程序退出了,那段內存也無法訪問了。
后面學習linux內核中的進程管理部分后,覺得這個想法存在問題。當一個進程執行完畢的時候,內核是要對這個進程申請的內存進行釋放,因為這是用戶地址空間的虛擬內存,所以無論這個進程是否delete,操作系統都是要進行回收的。
為了驗證我的想法,進行了如下測試:
#include<iostream> #include <unistd.h> using namespace std; int main(){ double *p=new double[26214400];//申請大約200M內存 for(int i=0;i<26214400;i++){ p[i]=i; } sleep(10);//睡眠10s return 0; }
測試結果如下:
這是程序運行前,使用了260M內存,剩余237M內存
程序運行的時候使用了461M內存,剩余36M內存。程序消耗201M內存
程序運行結束后,內存使用情況與程序未運行基本一樣。
同樣,樓主也測試了異常退出后的程序,內存也會被操作系統成功釋放。
也許,很多人會問:既然操作系統幫我把丟了的內存給收回來了,我是不是可以不用管內存泄漏了?
我認為不是這樣的:
1.程序和操作系統各有各自的責任,你編寫的程序一定要你所申請的內存的正確釋放。假如你的程序移植到其他系統,而那個系統沒有內存回收的功能呢?
2.很多服務器進程一般是守護進程,也就是一直在運行的進程。如果這個運行過程中,不停地產出內存泄漏,過不了多久程序便死了。系統的穩定性和性能大大降低。
綜上,無論操作系統是否幫你收拾泄露的內存,請負責好自己的部分。
Wind
2013-11-21