【发布时间】:2012-01-16 19:08:45
【问题描述】:
由于我的菜鸟名声,我无法回复这个Thread,特别是接受的答案:
我从未使用过 boost::intrusive 智能指针,但如果你要使用 shared_ptr 智能指针,你可以使用weak_ptr 对象作为缓存。
当系统决定释放它们的内存时,这些weak_ptr指针不计为引用,但只要对象尚未被删除,就可以用于检索shared_ptr。
这当然是一个直观的想法,但是,C++ 标准不支持weak_ptrs 的比较,因此它不能用作关联容器的键。这可以通过为weak_ptrs实现一个比较运算符来规避:
template<class Ty1, class Ty2>
bool operator<(
const weak_ptr<Ty1>& _Left,
const weak_ptr<Ty2>& _Right
);
这个解决方案的问题在于
(1) 比较运算符必须为每个比较获取所有权(即从weak_ptr refs 创建shared_ptrs)
(2)当最后一个管理资源的shared_ptr被销毁时,weak_ptr并没有从缓存中擦除,而是一个过期的weak_ptr被保存在缓存中。
对于 (2),我们可以提供一个自定义析构函数 (DeleteThread),但是,这需要再次从要删除的 T* 创建一个weak_ptr,然后可以使用它从缓存。
我的问题是,是否有更好的使用智能指针的缓存方法(我使用的是 VC100 编译器,没有提升),还是我根本不明白?
干杯,丹尼尔
【问题讨论】:
-
您不能更改任何基于密钥的容器的密钥!!!它必须是不可变的!您可以有一些自定义的 delete-the-last 伸出并从您的容器中删除条目。但是在容器中更改键值是一个巨大的禁忌。
-
这正是问题所在,我需要提供一个自定义删除器来从缓存中删除对象以避免缓存中的指针过期。还是您说的更笼统,因为引用计数正在改变?
标签: c++ caching shared-ptr smart-pointers weak-ptr