C++中的软(非弱)引用 - 是否可能?有实施吗?

Len*_*mel 6 c++ boost memory-management soft-references shared-ptr

在C++中,我正在使用boost::shared_ptrboost::weak_ptr自动删除不再需要的对象.我知道这些工作与引用计数.

在Java中,内存是由垃圾收集器,其consideres管理的内置对象引用为,WeakReference因为SoftReference在之间(可通过GC收集,但可能还有生存的GC)的东西,这是非常方便的用于缓存对象一段时间,但一旦可用内存不足就将它们丢弃.

所以现在我回到了C++中,我错过了软引用的安慰.我想知道软引用是否适用于引用计数.当清除对象的最后一个引用,并且仍然有一个引用时,它什么时候会被删除?我可以想到一些方案,但对我来说似乎都不聪明.

为了防止软引用和引用计数有适当的语义,我想知道这是否已经实现,可能是以一种甚至兼容的方式boost::shared_ptr(或C++ TR1等效std::shared_ptr的方式).

如果两个问题的答案都是否定的,那么对象缓存场景中的替代方案是什么?

编辑: 当然我说的是缓存实际上很有用的情况,因为构造对象的成本很高(想想几次访问数据库和网络查询),但是有太多东西要永远保存它们.

seh*_*seh 7

正如其他人所指出的,你可以在Boost库中找到引用的计数指针(及其伴随的对应物),但软参考思想中缺少的是对运行时环境的内存约束的一些了解.例如,在Java中,SoftReferencea WeakReference与其功能没有实质性的不同; 相反,它是运行时如何在内存压力不同的情况下保留或逐出这两种引用的合同.

为了在C++中模仿这种行为,你必须构建一个内存感知的引用缓存,它对你的应用程序的其余部分将保持弱的对象持有强引用.当缓存确定应用程序正在考虑其内存使用上限 - 或任何其他约束条件 - 它将释放强引用,放弃对象"收集"(达到零引用计数)并允许稍后使用的弱引用检测失效.


Pup*_*ppy -2

不,C++ 中没有这样的东西。也不应该有。每个物体都有重要的用途。如果没有,为什么你还留着它?以这种方式保留对象会导致内存泄漏。如果你需要一个对象,你就需要它。如果不这样做,就毁掉它。有用和无用之间没有中间地带,要么有用,要么没有。

如果你绝望的话,编写自己的垃圾收集器并自己实现这样的东西也不是不可能的。但我建议不要需要它们或根本不使用它们。

编辑:在对象缓存中,人们通常使用 LRU 缓存。当缓存未命中时,对最近最少使用的对象的引用将被销毁(如果缓存已满),创建新对象并将其作为最近使用的对象放入,而所有其他对象都会向下移动。但是,在实际需要 C++ 中的缓存策略之前,您通常需要从磁盘检索项目。创建大多数对象的成本并没有那么高。

  • 我不确定我是否明白软引用(正如 Brian 所描述的那样)是内存泄漏,而 LRU 缓存则不是。您要么需要该对象,要么不需要。 (3认同)
  • “大家围成一圈”=如果有空间,这个物体就值得拥有,如果没有,则不值得拥有。“LRU 缓存”= 我将使用 1GB 内存,我不在乎这是否意味着您的其他应用程序将无法运行。在桌面操作系统上,内存不足是一个罕见的问题,并且不需要应用程序太多的技术。“如果有空间”基本上总是正确的。在受限系统上,应用程序在内存使用方面进行协作非常重要,而软引用是实现这一目标的一种(相对生硬的)工具。 (2认同)