利用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启停
改进
- 使用非侵入式工具,如VS的umdh。
- 重载new和delete,统计代码中所有对象的个数和块大小。