学习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.很多服务器进程一般是守护进程,也就是一直在运行的进程。如果这个运行过程中,不停地产出内存泄漏,过不了多久程序便死了。系统的稳定性和性能大大降低。
综上,无论操作系统是否帮你收拾泄露的内存,请负责好自己的部分。