有效的现代C ++ (第136页)使用以下示例来激励std::weak_ptr
。缓存被定义为无序映射,其中指向对象的弱指针作为值。每当此缓存的客户端(按键)请求对象时,将查找相应的弱指针并在其上调用lock()
。如果生成的std::shared_ptr
不是null
,则会返回。否则,从外部数据库重新加载对象,输入到缓存中并返回std::shared_ptr
。
现在的问题是:有人可能认为可以在没有std::weak_ptr
的情况下实现它,而是将强共享指针存储为缓存值。如果强指针的use_count()
等于1,则表示所有客户端的指针都已被销毁。这个例子的重点是使用std::weak_ptr
允许我们通过实际删除对象来节省内存吗?
答案 0 :(得分:5)
"这个例子的重点是使用std :: weak_ptr允许我们通过实际删除对象来节省内存吗?"
是。否则,缓存将无限期地保留指向的资源。控制块所需的空间(如果单独分配)通常远远小于可能需要缓存的资源(例如纹理,网格数据,甚至是本地化字符串)。
虽然可以使用atomics实现相同的功能并检查引用计数为1,但这需要自定义句柄实现。 std::weak_ptr
和std::shared_ptr
使整个事情变得不那么简单。