簡體   English   中英

將weak_pointer.lock()遞增用於創建weak_ptr的原始shared_ptr的引用計數

[英]will weak_pointer.lock() increment the ref count of original shared_ptr which was used to create weak_ptr

根據我的理解,如果我們使用所有shared_ptr對象並且存在循環依賴性,則弱​​指針用於循環依賴性問題。 弱指針用於打破循環。 弱指針通過使用lock()創建共享指針來實現這一點。

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的ref計數將變為2.如果x離開作用域,仍然會有內存泄漏嗎? 因為我使用lock()創建了一個共享指針,並且ref count變為2.請讓我知道我的理解是否正確。

shared_ptr共享對象涉及兩個不同的引用計數:

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

weak_ptr僅對后者計數有貢獻。 當所有shared_ptr實例都被銷毀時,將調用對象刪除器,這通常是銷毀對象的默認實例。 如果存在弱指針,則控制塊仍然存在。 當所有弱指針都被破壞時,控制塊也會被破壞。

所以(忽略可能在每個shared_ptr實例中直接優化緩存對象指針),在你的情況下你有x指向(隱藏給你)到控制塊,它有一個指向A實例的指針。 並且您將該實例的b成員指向第二個控制塊,該控制塊具有指向B實例的指針。 最后,該實例有一個指向x指向的控制塊的指針,這是循環的,但不是所有權的循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM