linux中内存泄漏的检测(一)最简单的方法
来源:互联网 发布:java无jre目录怎么办 编辑:程序博客网 时间:2024/06/09 14:13
什么是内存泄漏
内存泄漏是指程序动态申请的内存在使用完后没有释放,导致这段内存不能被操作系统回收再利用。
例如这段程序,申请了4个字节的空间但没有释放,有4个字节的内存泄漏。
#include <iostream>using namespace std;int main(){ int *p = new int(1); cout <<*p<<endl; return 0}
随着时间的推移,泄漏的内存越来越多,可用的内存越来越少,轻则性能受损,重则系统崩溃。
一般情况下,发生内存泄漏时,重启就可以回收泄漏的内存。但是对于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}
方法分析
- 优点:
直观,容易理解,容易实现
- 缺点:
1.该方法要求运行结束时对运行中产生的打印分析才能知道结果。
2.该方法要求封装所有申请和释放空间的函数,并在调用的地方修改成调用封装后的函数。虽然C中申请/释放内存接口并不多,但是对于一个大型的项目,调用这些接口的地方却是很多的,要全部替换是一个比较大的工作量。
3.只对C语言适用,不能应用于C++
4.对于所调用的库不适用。如果希望应用于库,则要修改库代码
5.只能检测是否泄漏,却没有具体信息,比如泄漏了多少空间
6.不能说明是哪一行代码引起了泄漏
改进
这种方法虽然简单的,却有许多的不足,无法真正应用于项目中。欲知怎样改进,且看下回分解。
1 0
- linux中内存泄漏的检测(一)最简单的方法
- linux中内存泄漏的检测(一)最简单的方法
- vs中检测内存泄漏的方法
- vs中检测内存泄漏的方法
- vs中检测内存泄漏的方法
- vs中检测内存泄漏的方法
- vs中检测内存泄漏的方法
- vs中检测内存泄漏的方法
- C++中内存泄漏的检测方法
- vs中检测内存泄漏的方法
- vs中检测内存泄漏的方法
- vs中检测内存泄漏的方法
- MFC中内存泄漏的检测方法
- vs中检测内存泄漏的方法
- linux中内存泄漏的检测(五)记录内存泄漏的代码
- linux中内存泄漏的检测(五)记录内存泄漏的代码
- 检测内存泄漏的方法
- 一种简单的Visual C++中内存泄漏的检测方法
- iOS---限制文本框只能输入数字(转载)
- IE增强型安全配置导致网页弹窗被阻止
- 修改js 重启tomcat吗
- 【数据结构】二叉树
- JavaWeb学习笔记(三)--- post和get的区别、session和cookie的区别、forward和redirect的区别
- linux中内存泄漏的检测(一)最简单的方法
- windows下如何github ssh 公钥
- Android插件化(使用Small框架)
- 使用gradle多渠道打包
- postgreSQL 基本语法记录
- MFC应用程序创建窗口的过程
- Java --static关键字
- Linux下Opencv的安装及配置使用
- Maven——Project configuration is not up-to-date with pom.xml问题