![](/img/trans.png)
[英]Understanding of Scott Meyers' third example of std::weak_ptr
[英]Did I understand correctly the point of Scott Meyers' example of std::weak_ptr?
Effective Modern C ++ (第136頁)使用以下示例來激勵std::weak_ptr
。 緩存被定義為無序映射,其中指向對象的弱指針作為值。 每當此緩存的客戶端(按鍵)請求一個對象時,將查找相應的弱指針並在其上調用lock()
。 如果生成的std::shared_ptr
不為null
,則返回它。 否則,從外部數據庫重新加載對象,輸入到緩存中並返回std::shared_ptr
。
現在的問題是:有人可能認為可以在沒有std::weak_ptr
情況下實現它,而是將強共享指針存儲為緩存值。 如果強指針的use_count()
等於1,則表示所有客戶端的指針都已被銷毀。 這個例子的重點是使用std::weak_ptr
允許我們通過實際刪除對象來節省內存嗎?
“這個例子的重點是使用std :: weak_ptr允許我們通過實際刪除對象來節省內存嗎?”
是。 否則,緩存將無限期地保留指向的資源。 如果單獨分配,控制塊所需的空間通常遠小於可能需要緩存的資源類型(例如紋理,網格數據,甚至是本地化字符串)。
雖然可以使用原子實現相同的功能並檢查引用計數為1,但這需要自定義句柄實現。 std::weak_ptr
和std::shared_ptr
使整個事情變得不那么原型化了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.