2009-12-01 52 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