c++垃圾收集和循环引用数据
C++ garbage collection and circularly referenced data
我目前正在使用引用计数技术实现我的垃圾收集器(在c++中)。然而,有一个主要问题是,如果数据被循环引用,它们永远不会被收集,因为它们的引用计数总是非零。
我试着四处搜索,发现这些东西叫做跟踪垃圾收集器,标记和清除算法等。我有可能实现一个吗?它们究竟是如何工作的呢?
这是垃圾收集器设计中的一个经典问题。看看Wikipedia上的垃圾收集文章,它很好地展示了垃圾收集器设计中的不同权衡。"更进化"的;像三色标记这样的算法实际上非常简单,易于实现。我已经使用这些指令为我自己的c语言Lisp实现实现了一个跟踪收集器。
在跟踪垃圾收集器中最复杂的事情是遍历对象树(例如查找对"live"的引用)。对象)。如果您正在为另一种语言编写解释器,这并不太难,因为您可以在根对象类(或所有对象的其他公分母)中为此连接工具。然而,如果你在c++中为c++编写垃圾收集器,那么你将很难做到这一点,因为你需要检查对象内容以找到指向其他已分配内存区域的指针。
如果你是出于教育目的而编写垃圾收集器,我建议你考虑为另一种语言(不能直接访问指针的语言)编写解释器。如果您正在用c++编写c++的收集器,并打算在生产软件中使用它,我强烈建议您使用现有的生产质量实现来代替。
http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/weak_ptr.htm
weak_ptr类模板存储了对对象的"弱引用"这已经由shared_ptr管理。要访问对象,aWeak_ptr可以使用shared_ptr函数转换为shared_ptr构造函数或成员函数锁。当最后一个shared_ptr到对象消失,对象被删除,试图获得weak_ptr实例中的shared_ptr引用了已删除的对象将失败:构造函数将抛出类型为Boost::bad_weak_ptr和weak_ptr::lock将返回空要查看。"
你真的不应该有循环引用,但是如果你的设计不能重构它们(这种情况偶尔会发生),试着在一个方向上放置弱指针,这样它们就不会阻止销毁。
相关文章:
- 打破循环引用在C++中更优雅
- 如何编译使用循环引用的代码?
- 关于C++中引用计数和循环引用的概念
- CBasePin 递增对拥有过滤器的引用.循环引用?
- 使用带有循环引用的weak_ptr
- 如何避免成员回调和shared_ptr循环引用?
- std :: make_shared(),std :: feek_ptr和循环引用
- 由于具有循环引用的类中的unique_ptr或向量而导致核心转储
- 我的内存泄漏是由循环引用引起的吗?
- C++:外部对象循环引用
- 使用 std::weak_ptr 和别名构造函数中断循环引用:声音或有问题
- #ifndef是否可以防止循环引用编译器错误
- shared_ptr和循环引用
- boost::序列化和循环引用反序列化
- 两个类之间的循环引用
- 循环引用的问题
- C++11, shared_ptr.reset() 和循环引用
- 如何初始化 const 循环引用成员
- C++中两个类对象的循环引用
- 如何使用std::shared_ptr检测或避免循环引用