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 行作为循环的可能原因,以便我可以检查代码并决定是否需要更改它。
你有一个设计错误。因此,您需要使用设计调试工具。
拿一支笔和一张纸。
为每个类类型绘制一个矩形。从每个拥有shared_ptr的类到它所拥有的类绘制一个箭头。
如果你发现一个圆圈,那就是你的问题了。
现在,每个箭头或链接都是通过共享指针分配在某处创建的。
观察那些可疑的箭头,那些封闭圆圈的箭头,看看它们是否被正确释放。