30

考虑以下代码。

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

没有输出没有调用析构函数。内存泄漏。我一直认为智能指针有助于避免内存泄漏。

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

4

1 回答 1

59

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

介绍_shared_ptr

因为实现使用引用计数,shared_ptr实例的循环不会被回收。例如,如果main()持有一个shared_ptrto A,它直接或间接持有一个shared_ptrback to AA则 的使用计数将为 2。原始的破坏shared_ptr将留下A使用计数为 1 的悬空。weak_ptr 用于“中断循环”。

谢谢,格伦,为链接。

于 2009-12-01T15:28:13.763 回答