Valgrind
C/C++内存泄漏、内存错误检测工具
https://murphypei.github.io/blog/2019/04/valgrind-memory-leaky
valgrind --tool=memcheck --leak-check=full ./a.out
eg:
#include <iostream>
using namespace std;
struct Dad { };
struct Son: public Dad { int *m = new int[2](); }; //这里泄漏
int main()
{
Dad *d = new Son(1);
delete d;
}
这段代码发生了派生类指针到基类指针的类型转换,动态类型和静态类型不一致,运行时对象是派生类,静态类型是父类。但是由于析构函数不是虚函数,所以析构函数静态绑定到编译时类型(基类)上,导致delete
的时候调用了基类析构函数,导致派生类(运行时对象)的资源没有释放(m
管理的资源),发生内存泄漏。
下面用Valgrind工具分析(只列出summary部分):
==1633936== LEAK SUMMARY:
==1633936== definitely lost: 8 bytes in 1 blocks
==1633936== indirectly lost: 0 bytes in 0 blocks
==1633936== possibly lost: 0 bytes in 0 blocks
==1633936== still reachable: 0 bytes in 0 blocks
==1633936== suppressed: 0 bytes in 0 blocks
==1633936==
==1633936== For lists of detected and suppressed errors, rerun with: -s
==1633936== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
可以看出工具以及分析出8bytes的泄漏,这8bytes就是派生类m
管理的动态资源,两个int
元素数组的大小
这个工具也可以跟踪内存申请和回收,解决double free等问题
GDB
待完善