【发布时间】:2012-09-30 02:22:54
【问题描述】:
我们有自己的智能指针类,它使用基本的 AddRef 和 Release 进行引用计数。
在调试时,我可以看到很多对象没有被正确释放。我可以看到哪些对象没有被释放,但很难找出它们是从哪个位置分配的。
有什么好的设计模式可以解决这个问题吗?
我已经放置了调试语句以及 ADDREF 和 RELEASE,当调用 release 时我可以看到引用计数。在某些情况下它大于 1,这意味着指针没有被删除。
如果我开始在 shared_ptr const 上设置断点,那么它将被调用数百次,并且很难查明内存泄漏。
似乎创建了一些导致这些泄漏的循环引用。
【问题讨论】:
-
你是如何检测到东西没有被正确发布的?您使用的是哪个 IDE? MSVC 有一个快速而肮脏的
_CrtSetBreakAlloc,如果您可以确定地重现问题,这可能会有所帮助。 -
如果你有循环数据结构,那么不要使用引用计数。没有办法修复引用计数以考虑指针周期。
-
你是否正确实现了复制构造函数和赋值?
-
为什么不使用标准智能指针?
-
如果 RAII 实现正确(首先要检查),如果计数器不是原子管理的,多线程问题可能会破坏引用计数。最好的方法是使用
{std[::tr1]|boost}::shared_ptr(或ATL 智能指针,如果您使用它作为实现IUnknown 的一种方式)。但无论如何你可能都知道。
标签: c++ memory-leaks smart-pointers