2015-12-02 59 views
10

看來,weak_ptr不知何故只知道它的引用shared_ptr何時被銷燬。那個怎麼樣?是否有一個不斷的鏈接保持或什麼?當其shared_ptr被銷燬時,weak_ptr會發生什麼?

採取following code for example

weak_ptr<int> test() { 
    shared_ptr<int> foo{new int}; 

    return foo; 
} 

int main() { 
    auto foo = test(); 

    cout << foo.expired() << endl; 
} 

我本來期望段錯誤時weak_ptr<int>去檢查的shared_ptr<int>的狀態,但沒有一個。 weak_ptr<int>正確地將內存標識爲已解除分配。它如何知道?

+0

「的std :: weak_ptr的」保存到共享的引用引用的計數方式與'std :: shared_ptr'相同。唯一不同的是'std :: weak_ptr'不增加/減少這個計數。 –

+3

*我預料會出現段錯誤... *爲什麼?這就是weak_ptr – UmNyobe

+0

@UmNyobe的重點!我想我正在試圖溝通,我不明白它是如何工作的。 –

回答

12

std::shared_ptr使用兩個存儲器創建的:

  • 資源塊:它包含指針實際的基礎數據,例如'int *'

  • 控制塊:它保存特定於shared_ptr的信息,例如引用計數。

(有時這些在存儲器效率的單個塊分配,見std::make_shared

控制塊存儲基準計數weak_ptr。直到最後一個weak_ptr超出範圍(弱指針引用計數下降到零)纔會釋放它。

所以一個weak_ptr會知道它過期,因爲它可以訪問這個控制塊,它可以檢查引用計數是什麼一個shared_ptr

+0

我在這裏有一個誤解。所以你說**控制塊**實際存儲2個計數? 「weak_ptr」的數量和「shared_ptr」的數量?直到BOTH爲0,它才被銷燬? –

+2

@JonathanMee:這是正確的。 – AndyG

+2

@JonathanMee:是的,從概念上講就是這樣發生的事情。順便說一下,您可以打開標準庫頭文件並親自查看實現情況! –

相關問題