【发布时间】:2015-07-19 15:45:55
【问题描述】:
Effective Modern C++(第 136 页)使用以下示例来激励std::weak_ptr。缓存被定义为一个无序映射,其中指向对象的弱指针作为值。每当这个缓存的客户端请求一个对象(按键)时,就会查找相应的弱指针并在其上调用lock()。如果结果 std::shared_ptr 不是 null,则返回它。否则,从外部数据库重新加载对象,进入缓存并返回std::shared_ptr。
现在的问题是:有人可能认为没有std::weak_ptr 也可以实现这一点,而是将强共享指针存储为缓存值。如果强指针的use_count() 等于1,则表示所有客户端的指针都已销毁。这个例子的重点是使用std::weak_ptr 允许我们通过实际删除对象来节省内存吗?
【问题讨论】:
-
use_count永远不会是一:当您插入新对象时,缓存中有一份副本,并且返回一份,因此使用次数为二。谁会回去扫缓存? -
@KerrekSB 我认为您在谈论两件不同的事情。首先,当用户在他的副本上调用
reset()时,计数将再次变为1。当他继续从缓存中再次请求对象时,use_count()将是一个。其次,没有人会去扫现金,这意味着实际对象不会被删除。但这只是意味着您对我的问题的回答是肯定的,对吗?
标签: c++ c++11 weak-ptr effective-c++