介绍:
当程序员在堆上分配内存,忘了释放或者释放失败所申请的内存,内存泄露就随之出现,其一直是C代码 bug 的一部分。大多数程序员使用第三方库来检测自己的代码,其实可以在我们自己的程序上编写简单的代码来检测内存泄露,这样可以使得程序减少库的依赖。在C语言中申请内存通常使用malloc()和calloc(),释放的时候使用free()。有时候我们会忘记释放内存。下面介绍一下一个简单的方法检测程序中的内存泄露。
1.下面写一段忘记释放内存的代码作为例子。
test.c
#include<malloc.h>
int main()
{
char * ptr1 = (char *) malloc (10);
// allocating 10 bytes
int * ptr2 = (int *) calloc (10, sizeof(int));
// allocating 40 bytes let sizeof int = 4 bytes)
float * ptr3 = (float *) calloc (15, sizeof(float));
// allocating 60 bytes
............
............
............
free(ptr2);
return 0;
}
2.检测内存泄露
我在linux采用gcc进行测试,当然你可以在windows上用同样的代码进行测试
其实你只需要添加 leak_detector_c.h头文件,然后添加一行代码在main函数的最开始处。
test.c
#include<malloc.h>
#include "leak_detector_c.h"
int main()
{
char * ptr1;
int * ptr2;
float * ptr3;
atexit(report_mem_leak);
ptr1 = (char *) malloc (10);
// allocating 10 bytes
ptr2 = (int *) calloc (10, sizeof(int));
// allocating 40 bytes let sizeof int = 4 bytes)
ptr3 = (float *) calloc (15, sizeof(float));
// allocating 60 bytes
............
............
............
free(ptr2);
return 0;
}
编译并运行上面的代码
# gcc -c leak_detector_.c
# gcc -c test.c
# gcc -o memtest leak_detctor_c.o test.o
# ./memtest
# cat /home/leak_info.txt
结果如下:
Memory Leak Summary
-----------------------------------
address : 140668936
size : 10 bytes
file : test.c
line : 5
-----------------------------------
address : 140669560
size : 60 bytes
file : test.c
line : 7
-----------------------------------
输出显示引起内存泄露的行数。
如果你想检测多个源文件,你可以添加 leak_detector_c.h头文件到所以你想检测的源文件当中去。
3.下面简要介绍一下这个内存泄露检测方法是如何工作的。
leak_detector_c.h头文件中包含一些宏,预编译的时候会用xmalloc()
, xcalloc()
, xfree()
替换 malloc()
, calloc()
,free() 函数。这些函数会用链表记录每次内存分配的地址,文件名,行号等信息。这样释放内存则通过删除链表中的节点。atexit(report_mem_leak)会注册一个report_mem_leak()函数,在程序的结尾会被调用判断未释放内存的节点并显示出来。
原文连接:http://www.codeproject.com/KB/cpp/MemoryLeakDetectionIn_CPP.aspx