我是否正确理解了 Scott Meyers 的 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 允许我们通过实际删除对象来节省内存吗?

"Is the whole point of this example that using std::weak_ptr allows us to save memory by actually deleting the objects?"

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

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