5

Effective Modern C++(第 136 页)使用以下示例来激励std::weak_ptr. 缓存被定义为一个无序映射,其中指向对象的弱指针作为值。每当这个缓存的客户端请求一个对象(按键)时,相应的弱指针就会被查找并lock()在其上调用。如果结果std::shared_ptr不是null,则返回。否则,对象将从外部数据库重新加载,输入缓存并std::shared_ptr返回给它。

现在的问题是:有人可能认为可以在没有 的情况下实现这一点std::weak_ptr,而是将强共享指针存储为缓存值。如果use_count()一个强指针的值等于1,那意味着所有客户端的指针都被销毁了。这个例子的重点是使用std::weak_ptr允许我们通过实际删除对象来节省内存吗?

4

1 回答 1

7

“这个例子的重点是使用 std::weak_ptr 允许我们通过实际删除对象来节省内存吗?”

是的。否则,缓存将无限期地分配指向的资源。如果单独分配,控制块所需的空间通常比可能需要缓存的资源(例如纹理、网格数据,甚至本地化字符串)要少得多。

虽然可以使用原子实现相同的功能并检查引用计数为 1,但这需要自定义句柄实现。std::weak_ptr并使std::shared_ptr整个事情对原型的考验少得多。

于 2015-07-19T15:59:03.193 回答