2009-12-01 25 views
19

请考虑以下代码。如何通过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; 
} 

没有输出没有引号。内存泄漏。我始终认为,智能指针有助于避免内存泄漏。

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

回答

47

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

the shared_ptr introduction

由于实现使用引用计数,shared_ptr实例的周期将不被回收。例如,如果main()持有shared_ptrA,其直接或间接地保持shared_ptrAA的使用计数是2原始shared_ptr的破坏会留下A为1。使用计数使用weak_ptr到悬空“休息周期”。

谢谢,格伦,链接。

+6

@Alexey,这里有一个链接指向文档,它在介绍中明确提出了这个问题。 http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/shared_ptr.htm – Glen 2009-12-01 15:32:01

+2

哪一个?为什么不用弱引用替换它们呢?这是荒唐的。 'shared_ptr'被使用是有原因的。 – curiousguy 2011-10-09 02:10:50

+5

@curiousguy:我不确定我是否理解你的问题:你认为什么是荒谬的?要打破一个循环,你必须用一个弱引用来替换_one_强引用;哪一个完全取决于用例。你不能用弱引用替换所有的强引用,因为这样所有的对象都将被销毁,因为没有所有者离开。 – 2011-10-09 04:54:29