-1.Valgrind、GDB

  2021-9-10 


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

待完善


且听风吟