利用valgrind 工具检查内存泄漏

命令

valgrind --tool=memcheck --leak-check=full exe

--tool=memcheck:表示使用内存检查工具
--leak-check=full:表示检查所有情况
后接完整的程序名和命令行参数

操作

valgrind需要进程先attach后disattach后,才会输出最终结果。
执行上面的命令等待程序退出或者Ctrl+C终止。

样例

==23652== LEAK SUMMARY:
==23652==    definitely lost: 992 bytes in 3 blocks
==23652==    indirectly lost: 2,980 bytes in 14 blocks
==23652==      possibly lost: 31,520 bytes in 54 blocks
==23652==    still reachable: 9,035,317 bytes in 202,299 blocks

具体解释:
Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是确定的内存泄露(Definitely lost)。Possibly lost 是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的指针都位于内存泄露处。在上述的例子中,根节点是directly lost,而其他节点是indirectly lost。
一般来说,重点看definitely lost

结果

发现dbserver有些地方没有调用freeReplyObject

缺点

进程需要由valgrind启停

改进

  1. 使用非侵入式工具,如VS的umdh。
  2. 重载new和delete,统计代码中所有对象的个数和块大小。
posted @ 2022-01-21 10:02  天下太平  阅读(282)  评论(0编辑  收藏  举报