![]() |
1
5
我建议使用 Valgrind . 当您关闭进程时,它将显示所有泄漏的内存。除非关机以某种方式破坏了循环,否则任何循环都将显示为泄漏内存,Valgrind将告诉您代码中最初分配内存的位置。 |
![]() |
2
3
我曾经负责信用风险系统的设计(在C++中,虽然这不相关)。这些都是在节点上分配风险的非常大的图。我们有一个简单的启发式方法来确定我们是否在一个循环中——如果我们遍历了500次以上(我忘记了确切的数字——它是可配置的),答案是肯定的。大多数周期检测方案都依赖这样的启发式方法。 |
![]() |
3
1
我在过去也遇到过类似的问题——内存泄漏是由于共享的循环引用几个月没有被检测到。
当心“缓存”。我有一个对象(我们称之为“工厂”),它处理了项目(“小部件”)。小部件具有a)不可变的特性,b)具有
最终,我能够依靠我用来检测CRT内存泄漏的平台。Visual Studio的CRT具有内存泄漏检测和报告功能,我在测试程序中启用了该功能以防止退化:
GCC可能有类似的基本泄漏报告,但我不知道它是什么。 |
![]() |
4
1
我把上面的文章结合起来。我使用了一个内存分析器,提出了一些可疑的循环,并使用弱指针来打破这些循环。 我以前使用过内置的CRT内存泄漏检测,但不幸的是,在我的例子中,有几个静态单例在模块卸载之前无法释放,我认为这是在CRT探测器的生命周期之后。基本上,它给出了大量的误报。 |
![]() |
5
0
我想最简单的答案是只有这么多智能指针可以为您做: 我建议你什么时候录音 制作 一个循环(如果一次创建所有三个对象很简单,否则更复杂),然后检查删除/取消链接对象的记录,如果不可能,则定期检查。 |
![]() |
6
0
您可以实现某种调试接口,返回此对象拥有的共享指针列表。对于存储在共享资源中的每个类,都需要这样做。现在您有了一个可以遍历的通用图,并且可以在上面使用循环检测算法。我相信 Tarjan's strongly connected component algorithm 也许可以,但图论不是我的堡垒。 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 7 月前 |
![]() |
SpeakX · 多线程上下文中的弱指针未过期时更新 1 年前 |
|
Vincent31 · 对象上的C++共享指针多次调用析构函数 1 年前 |