2017-07-26 62 views
3

根據助推:鎖的執行情況()

要訪問該對象,的weak_ptr可以被轉換爲使用shared_ptr的構造或成員函數鎖定一個shared_ptr。

再次,從升壓:

shared_ptr<T> lock() const; 

//Returns: expired()? shared_ptr<T>(): shared_ptr<T>(*this). 

據我明白,返回shared_ptr<T>(*this)裝置創建具有的1引用計數一個新的shared_ptr;這絕對不是我們想要的。所以可能我不明白它是正確的。有人會解釋嗎?謝謝!

回答

3

不,這實際上是shared_ptr的要點 - 複製的實例將指向相同的基礎數據並增加兩個實例的引用計數。

這意味着shared_ptr<T>(*this)將創建一個指向相同數據的附加shared_ptr實例,並將增加this和新實例的引用計數。


它實際上是在真正的代碼更復雜,因爲原始shared_ptr數據通過weak_ptr實例訪問,但有效的原始shared_ptr數據在端共享(與共享引用計數在所有現有的增加對象的特定shared_ptr對象的副本)。

+0

但是,「返回:」行中顯示的代碼不是線程安全的。我猜這就是現在*實際*實現(我的標準筆記副本,「原子執行」)。 –

+0

這意味着'模板明確的shared_ptr(weak_ptr的常量& r);'被稱爲? – Sanich

+0

是的,在技術上原來的shared_ptr實例通過weak_ptr的訪問,但仍是(更新答案提及)。 – axalis

相關問題