内存泄漏检测

我在Linux编程中通常使用三种方法检测内存泄漏。

第一种方法是阅读程序源代码,打印和查看日志,观察分析程序的执行。

第二种方法使用valgrind:
    假设名为mytest的程序可能有内存泄漏的情况。
    那么执行命令:
        valgrind -v --tool=memcheck --leak-check=full ./mytest
    valgrind会打印出很多信息,比较重要的摘录如下:

        ==3127== malloc/free: in use at exit: 256 bytes in 1 blocks.
        ==3127== malloc/free: 4 allocs, 3 frees, 480 bytes allocated.
        ==3127==
        ==3127== searching for pointers to 1 not-freed blocks.

    上述信息表明存在内存泄漏。修改程序后再次执行:
        valgrind -v --tool=memcheck --leak-check=full ./mytest
    valgrind打印的信息摘录如下:

        ==3155== malloc/free: in use at exit: 0 bytes in 0 blocks.
        ==3155== malloc/free: 4 allocs, 4 frees, 480 bytes allocated.
        ==3155==
        ==3155== All heap blocks were freed -- no leaks are possible.

    上述信息表明已经没有内存泄漏了。

第三种方法使用mtrace:
    首先有如下用于实验的程序代码,main.cpp:
        #include <iostream>
        #include <cstdlib>
        #include <cstring>

        #include <mcheck.h>

        using namespace std;

        int main()
        {
            mtrace();

            char *p = (char *)malloc(128);
            free(p);
            p = (char *)calloc(256, 1);
            free(p);
            p = (char *)malloc(64);
            //free(p);
            p = new char [32];
            delete [] p;

            muntrace();

            return 0;
        }

    编译:
        g++ -g -W -Wall -Wextra -o mytest main.cpp

    函数mtrace给内存分配函数安装handler,muntrace函数禁止这些handler。
    这两个函数声明在mcheck.h文件中。mtrace会将环境变量MALLOC_TRACE指定
    的文件截短为0,以便向该文件写入相关的内存信息。因此使用如下命令
    执行程序:
        env MALLOC_TRACE=./mcheck.txt ./mytest

    调用muntrace函数之后,程序会将内存的动态分配信息写入
    环境变量MALLOC_TRACE指定的文件,这个例子生成的是
    名为mcheck.txt的文件。之后可以通过查看该文件的内容
    来检测是否存在内存泄漏:
    (不同的计算机生成的文件内容可能是不同的)
        = Start
        @ ./mytest:[0x80486ae] + 0x8ba0378 0x80
        @ ./mytest:[0x80486be] - 0x8ba0378
        @ ./mytest:[0x80486d2] + 0x8ba0378 0x100
        @ ./mytest:[0x80486e2] - 0x8ba0378
        @ ./mytest:[0x80486ee] + 0x8ba0378 0x40
        @ /usr/lib/libstdc++.so.6:(_Znwj+0x27)[0x6cceb27] + 0x8ba03c0 0x20
        @ /usr/lib/libstdc++.so.6:(_ZdlPv+0x21)[0x6ccc681] - 0x8ba03c0
        = End

    从文件中可以看到内存分配的地址和空间大小,以及内存的分配和释放的次数。
    加号代表分配,减号代表释放。有四个加号,而减号只有三个,说明有内存泄漏发生。
    修改上面源代码的第24行,再次编译执行,mcheck.txt的内容变为:
        = Start
        @ ./mytest:[0x80486ae] + 0x9765378 0x80
        @ ./mytest:[0x80486be] - 0x9765378
        @ ./mytest:[0x80486d2] + 0x9765378 0x100
        @ ./mytest:[0x80486e2] - 0x9765378
        @ ./mytest:[0x80486ee] + 0x9765378 0x40
        @ ./mytest:[0x80486fe] - 0x9765378
        @ /usr/lib/libstdc++.so.6:(_Znwj+0x27)[0x6cceb27] + 0x97653c0 0x20
        @ /usr/lib/libstdc++.so.6:(_ZdlPv+0x21)[0x6ccc681] - 0x97653c0
        = End

    没有内存泄漏了。


参考文献:
    mtrace(3), malloc_hook(3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目前有一款常用的内存泄漏检测工具是Visual Leak Detector(VLD)。 VLD是一款免费的内存泄漏检测工具,适用于Visual C环境。它能够为每个泄漏的块提供完整的堆栈跟踪信息,包括源文件和行号。同时,VLD可以检测大多数类型的进程内内存泄漏,包括基于COM的泄漏和纯Win32基于堆的泄漏。此外,VLD还支持设置过滤指定的模块,不参与内存泄漏检查,并提供泄漏块的完整数据转储。你可以将泄漏报告保存到文件或发送到调试器,并可以设置不同的详细级别。VLD是一个已经打包的库,使用时无需编译其源代码,只需引入头文件即可。它的源代码使用GNU许可发布,并有详尽的文档和注释,适合想深入了解堆内存管理的读者使用。 [2] 另外,还有一种内存泄漏检测工具是QT内置的功能。当一个QObject正在接受事件队列时,如果中途被销毁,可能会导致问题。为了避免这种情况,推荐使用QObject的deleteLater()函数来删除QObject对象。这个函数会发送一个删除事件到事件系统,让所有事件都处理完之后再清除内存。而且,即使多次调用deleteLater()函数也不会出现问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Qt / MSVC 中使用内存泄露检测工具 VLD(Visual Leak Detector)](https://blog.csdn.net/weixin_41863029/article/details/128482295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Qt内存泄漏总结(包括检测工具)](https://blog.csdn.net/a844651990/article/details/78814076)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值