關於程序退出后,是否還存在內存泄漏的現象。


  學習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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM