Linux下的mtrace工具可以帮助我们检查程序中是否有内存泄漏。GNU扩展函数mtrace会为内存分配函数(malloc, realloc, memalign, free等)注册hook,记录malloc/free信息。
使用时也非常简单,只需在代码中调用mtrace函数即可。这需要包含头文件mcheck.h。同时需要设置环境变量MALLOC_TRACE,指定信息输出到哪个文件。如果MALLOC_TRACE没有设置,或者设置的文件不可用或者不可写,那么将不会安装hook函数,mtrace不生效。
之后编译执行,会生成内存信息文件,利用mtrace工具即可查看,格式为mtrace ./bin out_file。如果有内存泄漏,会出现Memory not freed部分。编译时如果有-g选项则会在caller处显示代码信息,说明该处的malloc没有对应的free。
mtrace的原理是记录每一对malloc-free的执行,若每一个malloc都有相应的free,则代表没有内存泄露,对于任何非malloc/free情況下所发生的内存泄露问题,mtrace并不能找出来。也就是对于new的内存,只能检测出有泄露,但不能定位。
代码示例如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mcheck.h>
int main()
{
setenv("MALLOC_TRACE", "output", 1);
mtrace();
char *text = (char *)malloc(sizeof(char) * 100);
// free(text);
return 0;
}
valgrind中 memcheck工具可以探测程序中内存的使用情况,它检查所有对内存的读写,并截取所有malloc/free 、new/delete调用。因此memcheck可以检查如下问题:
1.使用未初始化的内存;
2.读写已经被释放的内存;
3.读写内存越界;
4.读写不恰当的内存栈空间;
5.内存泄漏;
6.malloc/new/new[]与free/delete/delete[]不匹配。
检查内存泄漏,执行valgrind --tool=memcheck --leak-check=full ./bin