Effective Modern C++(第136頁)使用以下示例來激勵std::weak_ptr
。高速緩存被定義爲一個無序映射,其中有指向對象的弱指針作爲值。只要這個緩存的客戶請求一個對象(通過鍵),就會查找相應的弱指針並在其上調用lock()
。如果得到的std::shared_ptr
不是null
,則返回。否則,該對象將從外部數據庫重新加載,然後輸入緩存並返回std::shared_ptr
。我理解了Scott Meyers的std :: weak_ptr示例的正確點嗎?
現在的問題:人們可能會認爲有可能不使用std::weak_ptr
來實現這一點,而是將強共享指針存儲爲緩存值。如果一個強指針的use_count()
等於1,那意味着所有客戶端的指針都被銷燬了。這個例子中使用std::weak_ptr
的整點是否允許我們通過實際刪除對象來節省內存?
'use_count'永遠不會是一個:當你插入新的對象,你有一個副本在緩存中,一個被返回,所以使用計數是兩個。誰會回去清理緩存? –
@KerrekSB我認爲你在談論兩件不同的事情。首先,當用戶在他的副本上調用reset()時,計數將再次變爲1。當他繼續並再次從緩存中請求對象時,'use_count()'將成爲一個。其次,沒有人會去清理現金,這意味着實際的對象不會被刪除。但這僅僅意味着你對我的問題回答「是」,對嗎? – AlwaysLearning