2014-03-06 96 views
1

根據我的理解,如果我們使用所有shared_ptr對象並且存在循環依賴關係,則會使用弱指針來發生循環依賴性問題。弱指針被用來打破週期。弱指針通過使用lock()來實現這一點,這將創建共享指針。weak_pointer.lock()會增加用於創建weak_ptr的原始shared_ptr的引用計數

class A { shared_ptr<B> b; ... }; 
class B { weak_ptr<A> a; ... }; 
shared_ptr<A> x(new A); // +1 
x->b = new B;   // +1 
x->b->a = x;   // No +1 here 

但現在假設我創建鎖調用X-> B-> a.lock(),所以x的引用計數將成爲2.如果x離開的範圍,仍然會出現內存泄漏權?因爲我使用lock()創建了一個共享指針,並且ref count變爲2.請讓我知道我的理解是否正確。

+3

當由lock()創建的對象被其析構函數銷燬時,它會再次遞減計數。 –

+1

你對'lock()'的返回值做了什麼?如果您忽略它,鎖定會立即再次移除。 – aschepler

+0

一個相當簡單的示例程序(https://ideone.com/3JQsaX)會告訴你發生了什麼。鎖()變得非常無用,因爲你正在使用它。 – WhozCraig

回答

3

這裏涉及用於shared_ptr共享對象不同的參考計數:

  • 到對象的引用的數目,即shared_ptr實例。
  • 控制塊的引用次數,即shared_ptrweak_ptr實例。

A weak_ptr只對後者有幫助。當所有shared_ptr實例已被銷燬時,將調用對象刪除器,這通常是銷燬對象的默認設置。如果有弱指針,控制塊仍然存在。當所有弱指針都被銷燬時,控制塊也被銷燬。因此(忽略每個shared_ptr實例中可能優化緩存對象指針的可能優化),在您的情況下,您有x指向(對您隱藏)到控制塊,該塊具有指向A實例的指針。並且您有該實例的b成員指向第二個控制塊,其中有一個指向B實例的指針。最後,該實例有一個指向x指向的控制塊的指針,這是循環的,但不是所有權的循環。

相關問題