查找 shared_ptr 的引用计数增加的位置

Mal*_*ous 5 c++ valgrind memory-leaks shared-ptr

我有一些代码存在内存泄漏,因为它在其shared_ptr实例之间获取循环引用(这是两个shared_ptr实例指向的对象,每个实例都有shared_ptr对另一个类实例的内部引用。这意味着两个类都不会被销毁,因为每个类另一个实例仍在使用,导致内存泄漏。在某些情况下,它也是shared_ptr引用自身的类的单个实例。)

通过 Valgrind 运行代码很有帮助,因为它告诉我最初分配内存的位置,但这不是循环引用的来源。我需要找到特定共享指针(Valgrind 抱怨的那个)的引用计数增加的所有位置,因为必须将其中之一更改为 aweak_ptr来解决问题。

如何选择一个特定的shared_ptr并获取其引用计数增加的所有源代码行的列表?

我在 Linux 下运行 GCC/GDB 和 Valgrind,但欢迎使用平台中立的解决方案。

下面是一些示例代码来演示这个问题:

#include <boost/shared_ptr.hpp>

struct Base {
    int i;
};
struct A: public Base {
    int a;
    boost::shared_ptr<Base> ptrInA;
};
struct B: public Base {
    int b;
    boost::shared_ptr<Base> ptrInB;
};

int main(void)
{
    boost::shared_ptr<A> a(new A);   // Line 17
    boost::shared_ptr<B> b(new B);
    a->ptrInA = b;                   // Line 19
    b->ptrInB = a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 Valgrind 下运行时,它说:

HEAP SUMMARY:
    in use at exit: 96 bytes in 4 blocks
  total heap usage: 4 allocs, 0 frees, 96 bytes allocated

96 (24 direct, 72 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 4
   at 0x4C2A4F0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
   by 0x40099A: main (test.cpp:17)

LEAK SUMMARY:
   definitely lost: 24 bytes in 1 blocks
   indirectly lost: 72 bytes in 3 blocks
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种解决方案,它将我指向源文件中的第 19-20 行作为循环的可能原因,以便我可以检查代码并决定是否需要更改它。

Yoc*_*mer 1

你有一个设计错误。因此,您需要使用设计调试工具。

拿一支笔和一张纸。
为每个类类型绘制一个矩形。从每个拥有shared_ptr的类到它所拥有的类绘制一个箭头。
如果你发现一个圆圈,那就是你的问题了。

现在,每个箭头或链接都是通过共享指针分配在某处创建的。
观察那些可疑的箭头,那些封闭圆圈的箭头,看看它们是否被正确释放。