boost::shared_ptr
和boost::weak_ptr
来自动删除不再需要的对象。我知道这些是通过引用计数实现的。在Java中,内存由垃圾收集器管理,将内置对象引用视为强引用,
WeakReference
视为弱引用,SoftReference
则介于两者之间(可能会被GC回收,但也可能在GC后幸存),这对于缓存对象并在空闲内存不足时立即丢弃它们非常方便。所以现在我又回到了C++,我想念拥有软引用的舒适感。我想知道在引用计数下是否实用软引用。当最后一个强引用到对象被清除,并且仍然存在一个软引用时,它将在什么时候被删除?我可以想到一些方案,但没有一个看起来聪明。
如果有适当的软引用语义和引用计数,我想知道是否已经实现了这一点,也许以与 boost::shared_ptr
(或 C++ TR1 等效的 std::shared_ptr
) 兼容的方式。
如果两个问题的答案都是否定的,那么在对象缓存场景中有哪些替代方案呢?
编辑: 当缓存实际上是有用的时候,我当然是在谈论一个情况,因为构造这些对象是昂贵的(考虑到对数据库的多次访问和网络查询),但是又有太多的对象无法永久保留。