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

时间:2009-12-01 15:24:59

标签: c++ boost memory-leaks shared-ptr smart-pointers

请考虑以下代码。

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;
}

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

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

1 个答案:

答案 0 :(得分:49)

如果您有这样的循环引用,则一个对象应该与另一个对象保持weak_ptr,而不是shared_ptr

来自the shared_ptr introduction

  

由于实现使用引用计数,因此不会回收shared_ptr个实例的循环。例如,如果main()持有shared_ptrAshared_ptr直接或间接地将A保留回Ashared_ptr的使用计数将为2.原始A的销毁将使weak_ptr悬空,使用次数为1.使用{{1}}“打破周期。”

谢谢,Glen,链接。