怎么样来检查Linux系统下内存泄漏
1个回答
展开全部
内存泄漏是指程序动态申请的内存在使用完后没有释放,导致这段内存不能被操作系统回收再利用。 例如这段程序,申请了4个字节的空间但没有释放,有4个字节的内存泄漏。
#include <iostream>using namespace std;int main()
{ int *p = new int(1); cout <<*p<<endl; return 0}
1
2
3
4
5
6
7
8
9
随着时间的推移,泄漏的内存越来越多,可用的内存越来越少,轻则性能受损,重则系统崩溃。
一般情况下,发生内存泄漏时,重启就可以回收泄漏的内存。但是对于Linux,通常跑的是服务器程序,不可以随意重启,在内存泄漏问题上就要格外小心。
内存泄漏特点
难复现 — 要运行到足够长的时间才会暴露。
难定位 — 出错位置是随机的,看不出与内存泄漏的代码有什么联系。
最简单的方法
为了避免写出内存泄漏的程序,通常会有这样的编程规范,要求我们在写程序时申请和释放成对出现的。因为每一次申请都意味着必须有一次释放与它相对应。
基于这个特点,一种简单的方法就是在代码中统计申请和释放的次数,如果申请和释放的数量不同,就认为是内存泄漏了。
#include "stdio.h"#include "stdlib.h"int malloc_count, free_count;void * my_malloc(int size)
{
malloc_count++; return malloc(size);
}void my_free(void *p)
{
free_count++; free(p);
}int main()
{
count = 0; int *p1 = (int *)my_malloc(sizeif(int)) int *p2 = (int *)my_malloc(sizeif(int)) printf("%d, %d", p1, p2);
my_free(p1); if(malloc_count != free_count) printf("memory leak!\n"); return 0}
#include <iostream>using namespace std;int main()
{ int *p = new int(1); cout <<*p<<endl; return 0}
1
2
3
4
5
6
7
8
9
随着时间的推移,泄漏的内存越来越多,可用的内存越来越少,轻则性能受损,重则系统崩溃。
一般情况下,发生内存泄漏时,重启就可以回收泄漏的内存。但是对于Linux,通常跑的是服务器程序,不可以随意重启,在内存泄漏问题上就要格外小心。
内存泄漏特点
难复现 — 要运行到足够长的时间才会暴露。
难定位 — 出错位置是随机的,看不出与内存泄漏的代码有什么联系。
最简单的方法
为了避免写出内存泄漏的程序,通常会有这样的编程规范,要求我们在写程序时申请和释放成对出现的。因为每一次申请都意味着必须有一次释放与它相对应。
基于这个特点,一种简单的方法就是在代码中统计申请和释放的次数,如果申请和释放的数量不同,就认为是内存泄漏了。
#include "stdio.h"#include "stdlib.h"int malloc_count, free_count;void * my_malloc(int size)
{
malloc_count++; return malloc(size);
}void my_free(void *p)
{
free_count++; free(p);
}int main()
{
count = 0; int *p1 = (int *)my_malloc(sizeif(int)) int *p2 = (int *)my_malloc(sizeif(int)) printf("%d, %d", p1, p2);
my_free(p1); if(malloc_count != free_count) printf("memory leak!\n"); return 0}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询