C ++垃圾收集和循环引用的数据

时间:2011-12-19 17:23:08

标签: c++ garbage-collection circular-reference

我目前正在使用引用计数技术实现我的垃圾收集器(在C ++中)。但是,有一个主要问题是,如果数据是循环引用的,那么它们永远不会被收集,因为它们的引用计数总是非零。

我试着四处搜寻,发现这些东西叫做跟踪垃圾收集器,标记和扫描算法等。我可以实现一个吗?它们究竟是如何运作的?

2 个答案:

答案 0 :(得分:3)

这是垃圾收集器设计中的经典问题。看一下Garbage Collection article on Wikipedia,它非常适合展示垃圾收集器设计中的不同权衡。像三色标记这样的“更进化”的算法实际上非常简单且易于实现。我已经使用那些指令在C中为我自己的Lisp实现实现了一个跟踪收集器。

跟踪垃圾收集器时要处理的最复杂的事情是遍历对象树(例如,查找对“实时”对象的引用)。如果您正在为另一种语言编写解释器,这并不太难,因为您可以在根对象类(或所有对象的其他公分母)中为此设置连接。但是,如果您在C ++中为C ++编写垃圾收集器,那么您将很难执行此操作,因为您需要检查对象内容以查找指向其他已分配内存区域的指针。

如果您正在为教育目的编写垃圾收集器,我建议您考虑为另一种语言(一种无法直接访问指针)编写解释器。如果您是在C ++中为C ++编写收藏夹,目的是在生产软件中使用它,我强烈建议您改为使用an existing production-quality implementation

答案 1 :(得分:1)

http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/weak_ptr.htm

  

“weak_ptr类模板存储对象的”弱引用“   这已经由shared_ptr管理了。要访问该对象,a   可以使用shared_ptr将weak_ptr转换为shared_ptr   构造函数或成员函数锁。当最后一个shared_ptr来   对象消失,对象被删除,尝试获取   来自weak_ptr实例的shared_ptr引用已删除的   对象将失败:构造函数将抛出类型的异常   boost :: bad_weak_ptr和weak_ptr :: lock将返回一个空的   shared_ptr的“。

你不应该真的有循环引用,但如果你正在使用一个你无法重构它们的设计(偶尔会发生这种情况),试着在其中一个方向放置弱指针,这样它们就不会防止破坏。