C 检测内存泄露

介绍:

当程序员在堆上分配内存,忘了释放或者释放失败所申请的内存,内存泄露就随之出现,其一直是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




  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值