是否有任何提示/寻找的shared_ptr的循环引用花样?

这是什么,我想找到一个〔实施例 - 不幸的是,我似乎无法找到我的代码回路

struct A
{
  boost::shared_ptr<C> anC;
};

struct B
{
  boost::shared_ptr<A> anA;
};

struct C
{
  boost::shared_ptr<B> anB;
};
有帮助吗?

解决方案 4

我用上述职位的组合。我使用的存储器分析器,用一些怀疑周期上来,并通过使用了weak_ptr的爆发那些。

我用内置的CRT内存泄漏检测之前,但不幸的是在我的情况下,有一些不得到释放,直到模块卸载,我认为这是CRT探测器生命周期后几个静态单身。基本上,它给出了渗出的很多是假阳性。

其他提示

我推荐使用 Valgrind的。当您关闭的过程中,它会告诉你所有泄漏的内存。除非您关闭某种程度上打破了周期,任何周期应该显示为泄漏的内存和Valgrind的会告诉你,在你的代码中的内存最初从分配的。

我负责信用风险系统的设计一次的(在C ++中,虽然不相关)。这些东西都是与节点分配的风险非常大图。我们有一个简单的规则发现,如果我们是在一个循环 - 如果我们走过的500倍以上(我忘了确切的数字 - 这是可配置),答案是肯定的。大多数循环检测方案依赖于这样的启发。

我已经有过类似的问题 - 由于shared_ptr的是也未被发现几个月循环引用的内存泄漏

当心“高速缓存”。我有一个对象(我们称之为“工厂”),该处理了项目(“小工具”)。窗口小部件具有被A)的不可变的性质,和B)具有shared_ptr<Factory>它的创造者(它有时产生其他窗口小部件等等)。一切运行良好,直到我说一个Widget缓存来厂 - 因为小部件是不可变的,这是有意义的缓存它们,交还它要求相同的Widget每次。我的缓存是shared_ptr<Widget>的缓存,这样的即时无声泄漏。该修补程序是显而易见的,所以我不会去到他们。

最后,我能够瘦我用来检测从CRT这样的存储器泄漏在平台上。 Visual Studio的CRT有内存泄漏检测和报告,这是我在我的测试方案,以防止回归启用:

int main()
{
    // code code code
    // code code code

#ifdef _MSC_VER
    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
    _CrtDumpMemoryLeaks();
#endif
}

GCC可能有类似的基本泄漏的报告,但我不知道它是什么。

我想最简单的答案是,只有这么多智能指针可以为你做什么:

我建议记录时,你的的一个循环,(容易,如果你一次创建三个对象,否则麻烦...),然后检查在那里你删除/取消链接对象的记录,或只是周期性地,如果这是不可能的。

您可以实现某种形式的调试接口,返回该对象所拥有shared_ptrs的列表。你需要存储在一个shared_ptr每类做到这一点。现在你有一个通用的图形,你可以穿越,并且可以在其使用周期检测算法。我相信的Tarjan的强连通分量算法可能会为这一点,但图论工作是不是我的专长。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top