Chinaunix

标题: 检测内存泄露 [打印本页]

作者: 寻蝉林子    时间: 2016-11-26 16:45
标题: 检测内存泄露
本帖最后由 寻蝉林子 于 2017-12-16 23:07 编辑

问题:如何检测malloc申请的内存是否完全释放?
解决方法:eg:
#include <stdlib.h>
#include <mcheck.h>

int main()
{
     char *a, *b;
     setenv("MALLOC_TRACE", "output.log", 1);

    mtrace();
    a=(char *)malloc(4*sizeof(int));
    b=(char *)malloc(2*sizeof(int));
    muntrace();
    free(a);
    free(b);
}

注释:
1.setenv设置环境变量,output.log是保存结果的文件名;
2.mtrace()记录malloc申请的内存首地址以及内存的大小;
3.muntrace()记录free释放的内存首地址;
4.内存空间的大小是16进制;
5.为便于观察没释放,可以把其中一个或多个free()注释,再编译运行;

为便于统计结果:
在output.log文件中;
mtrace()把检测到malloc申请内存的地址前面有有 “+”
muntrace()把检测到free()释放的内存地址前面有 “-”
因此只需要统计 “+”, “-”的行数是否相等即可;
统计脚本:

#!/bin/bash
awk 'BEGIN{FS=" "} {for(i=1; i<=NF; i++)a[$i]++} END { for(i in a){if(i=="+")print i"="a;if(i=="-")print i"="a;}}' $1



2016-11-26_164142.png (20.86 KB, 下载次数: 19)

效果图

效果图

2016-11-26_165601.png (7.88 KB, 下载次数: 16)

统计结果

 统计结果

作者: codechurch    时间: 2016-11-28 13:17
使用valgrind,很方便。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2