【发布时间】:2015-02-03 04:43:47
【问题描述】:
我有一些代码存在内存泄漏,因为它在其shared_ptr 实例之间循环引用(这是两个shared_ptr 实例指向对象的地方,每个对象都有一个对另一个类实例的内部shared_ptr 引用。这意味着两个类都不会被销毁,因为每个类实例仍在被另一个类使用,从而导致内存泄漏。在某些情况下,它也是一个引用自身的类的单个 shared_ptr 实例。)
通过 Valgrind 运行代码很有帮助,因为它告诉我最初分配内存的位置,但这不是循环引用的来源。我需要找到特定共享指针(Valgrind 抱怨的那个)的引用计数增加的所有地方,因为其中一个必须更改为 weak_ptr 才能解决问题。
如何选择特定的shared_ptr 并获取其引用计数增加的所有源代码行的列表?
我正在使用 GCC/GDB 和 Valgrind 在 Linux 下运行,但欢迎使用平台中立的解决方案。
这里有一些示例代码来演示这个问题:
#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;
}
在 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
我正在寻找一种解决方案,将源文件中的第 19-20 行作为循环的可能原因,以便我可以检查代码并决定是否需要对其进行更改。
【问题讨论】:
-
暂时将代码中的定义更改为
unique_ptr怎么样,因为这会在复制共享指针的所有位置出现编译错误。 -
我要推荐一个可怕的东西,但是调整 shared_ptr 并放入钩子以查看发生了什么事情。 :X
标签: c++ memory-leaks valgrind shared-ptr