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

C++ garbage collection and circularly referenced data

本文关键字:循环 引用 数据 c++      更新时间:2023-10-16

我目前正在使用引用计数技术实现我的垃圾收集器(在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将返回空要查看。"

你真的不应该有循环引用,但是如果你的设计不能重构它们(这种情况偶尔会发生),试着在一个方向上放置弱指针,这样它们就不会阻止销毁。