c++ - Soft (not : weak) references in C++ - Is it possible? 有实现吗?

标签 c++ memory-management boost shared-ptr soft-references

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

在 Java 中,内存由垃圾收集器管理,垃圾收集器将内置对象引用视为 strong,将 WeakReference 视为 weak 并且SoftReference作为介于两者之间的东西(可能被 GC 收集,但也可能在 GC 中幸存下来),这对于缓存对象一段时间非常方便,但一旦可用内存变低就将它们丢弃。

所以现在我又回到了 C++ 中,我想念软引用带来的舒适感。我想知道软引用是否完全适用于引用计数。当对象的最后一个strong 引用被清除,并且还剩下一个soft 引用时,到底什么时候删除它?我能想到一些方案,但在我看来它们都不聪明。

以防软引用和引用计数有适当的语义,我想知道这是否已经实现,也许以一种甚至与 boost::shared_ptr(或 C++就此而言,TR1 等效 std::shared_ptr

如果两个问题的答案是否定的,对象缓存场景中有哪些替代方案?

编辑: 当然,我说的是缓存实际有用的情况,因为构建对象成本(想想对数据库的多次访问和网络查询),但对象太多了永远保留它们。

最佳答案

正如其他人指出的那样,您可以找到 referenced counted pointers (及其随从 weak counterparts )在 Boost 库中,但软引用 思想缺少对运行时环境的内存限制的一些认识。例如,在 Java 中,SoftReference 在功能上与 WeakReference 没有本质区别;相反,它是 the contract for how the runtime will preserve or evict the two kinds of references面对不同的内存压力。

为了在 C++ 中模仿这种行为,您必须构建一个内存感知引用缓存,该缓存对您的应用程序的其余部分持有的对象持有强引用/em>。当缓存确定应用程序正在触及其内存使用上限 - 或任何其他约束条件时 - 它会释放强引用,交出对象以进行“收集”(达到零引用计数)并允许以后使用弱引用检测失效。

关于c++ - Soft (not : weak) references in C++ - Is it possible? 有实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175011/

相关文章:

c++ - 未知对象的序列化

c++ - 具有可变参数大小的函数 : How to conditionally set some arguments?

c++ - 当一个进程截断由 boost 进程间库创建的共享内存时,进程需要重新映射

c++ - 编译器如何评估 c 中的 sizeof 运算符

C++,没有 <vector> 的对象数组

c++ - while(getline()) 在最后一次通过后没有空字符串的循环

您可以在 XP 上调整 C 运行时堆段保留大小吗?

c - 类似于 scanf 的函数中的内存泄漏问题

c++ - 如何在函数指针中模板化参数?

objective-c - Cocoa/Objective-C 中内存管理的单元测试