寻蝉林子 发表于 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



codechurch 发表于 2016-11-28 13:17

使用valgrind,很方便。
页: [1]
查看完整版本: 检测内存泄露