如何使用shared_ptr避免内存泄漏?

Ale*_*tov 23 c++ boost memory-leaks smart-pointers shared-ptr

请考虑以下代码.

using boost::shared_ptr;
struct B;
struct A{
    ~A() { std::cout << "~A" << std::endl; }
    shared_ptr<B> b;    
};
struct B {
    ~B() { std::cout << "~B" << std::endl; }
    shared_ptr<A> a;
};

int main() {
    shared_ptr<A> a (new A);
    shared_ptr<B> b (new B);
    a->b = b;
    b->a = a;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有输出.没有调用desctructor.内存泄漏.我一直认为智能指针有助于避免内存泄漏.

如果我需要在类中进行交叉引用,我该怎么办?

Jam*_*lis 52

如果你有像这样的循环引用,一个对象应该保持另一个对象weak_ptr,而不是a shared_ptr.

shared_ptr介绍:

由于实现使用引用计数,shared_ptr因此不会回收实例的循环.例如,如果main()保持shared_ptrA,其直接或间接地保持shared_ptrA,A的使用计数是2的原始的破坏shared_ptr会留下A与1.使用的使用计数悬空weak_ptr '打破循环’.

谢谢,格伦,链接.

  • @curiousguy:我不确定我理解你的问题:你觉得什么是荒谬的?要打破一个循环,必须用弱引用替换_one_强引用; 哪一个完全取决于用例.您不能用弱引用替换所有强引用,因为所有对象都将被销毁,因为没有所有者. (7认同)
  • @Alexey,这里是文档的链接,它在介绍中明确警告了这个问题.http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/shared_ptr.htm (6认同)
  • 哪一个?为什么不用弱引用替换它们呢?这是荒唐的.使用`shared_ptr`是有原因的. (2认同)