簡體   English   中英

shared_ptr,weak_ptr和循環依賴

[英]shared_ptr, weak_ptr and circular dependencies

我認為我的問題類似於shared_ptr和weak_ptr的區別 ,但我有興趣了解它們如何協同工作,而不是列出差異。

Wikipedia在shared_ptr和weak_ptr上的頁面聲明了weak_pointer可用於解決循環依賴問題,並給出了一個示例:

std::shared_ptr<int> p1(new int(5));
std::weak_ptr<int> wp1 = p1; //p1 owns the memory.

{
  std::shared_ptr<int> p2 = wp1.lock(); //Now p1 and p2 own the memory.
  if(p2) //Always check to see if the memory still exists
  { 
    //Do something with p2
  }
} //p2 is destroyed. Memory is owned by p1.

p1.reset(); //Memory is deleted.

std::shared_ptr<int> p3 = wp1.lock(); //Memory is gone, so we get an empty shared_ptr.
if(p3)
{
  //Will not execute this.
}

但是我看不到循環依賴關系,所以我不明白weak_pointer如何解決問題。

我本來希望看到某個對象a指向對象b ,並且b以某種方式指向a (在有向圖邊之一之間填充了weak_ptr來打斷鏈)。

榜樣是好的,我的想法是不好的嗎? 還是有一個更好的問題和解決方案的例子?

在當前版本的Wikipedia頁面中,該示例旨在演示總體上使用std::weak_ptr ,而不是特別消除強循環引用。 (僅在提供示例后才提及循環引用。)

什么例子顯示的是, wp1 ,盡管其一生,沒有自己的內存指出, p1 ,以及wp1正確地檢測到內存中刪除一次p1復位。 換句話說, wp1既不會干擾動態分配對象的刪除,也不會在通過弱指針(正確)訪問已刪除對象時引起未定義的行為。

因為弱指針不會干擾釋放,所以弱指針不僅可用於避免引用循環,而且可用於實現存儲附加屬性或緩存現有對象的計算屬性的關聯數組。 由於此類緩存不會干擾釋放,因此它們可以依靠不再使用的主要對象在不再使用時被刪除,而無需特定於緩存的驅逐策略。

暫無
暫無

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

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