2014-01-13 127 views
1

我認爲我的問題與​​類似,但我很感興趣的是看它們是如何一起工作的,而不是差異列表。shared_ptr,weak_ptr和循環依賴關係

維基百科上關於shared_ptr and 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勻在有向圖的一個邊緣之間打破鏈)。

這個例子很好,我的想法很糟糕嗎?還是有更好的問題和解決方案的例子?

+0

「_state weak_pointer可以用來解決循環依賴問題_」,兩者都是完全錯誤的;弱引用的用途很少,並且循環依賴不是一個 – curiousguy

回答

1

在維基百科頁面的當前版本中,該示例旨在展示一般情況下std::weak_ptr的用法,特別是不消除強循環引用。 (循環引用只提到後的例子已經呈現。)

什麼例子顯示的是wp1,儘管它的生命週期,不指向p1擁有內存和wp1正確地檢測一旦p1被重置,刪除該內存。換句話說,wp1既不會干擾刪除動態分配的對象,也不會在刪除的對象通過弱指針正確訪問時導致未定義的行爲。

因爲它們不干涉解除分配,所以弱指針不僅用於避免引用循環,還用於實現存儲附加屬性或緩存現有對象的緩存計算屬性的關聯數組。由於這樣的緩存不會干擾解除分配,因此它們可以依賴主要對象在不再使用時被刪除,而不需要特定於緩存的逐出策略。