我是否正确理解了Scott Meyers关于std :: weak_ptr的例子?

时间:2015-07-19 15:45:56

标签: c++ c++11 weak-ptr effective-c++

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

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

1 个答案:

答案 0 :(得分:5)

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

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

虽然可以使用atomics实现相同的功能并检查引用计数为1,但这需要自定义句柄实现。 std::weak_ptrstd::shared_ptr使整个事情变得不那么简单。