Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;垃圾收集和循环引用数据_C++_Garbage Collection_Circular Reference - Fatal编程技术网

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

C++ C++;垃圾收集和循环引用数据,c++,garbage-collection,circular-reference,C++,Garbage Collection,Circular Reference,我目前正在使用引用计数技术实现我的垃圾收集器(在C++中)。然而,有一个主要的问题是,如果数据被循环引用,它们永远不会被收集,因为它们的引用计数总是非零 我试着四处搜索,发现这些东西叫做跟踪垃圾收集器、标记和扫描算法等等。我能实现一个吗?它们究竟是如何工作的? 弱类模板存储对对象的“弱引用” 这已经由共享ptr管理。要访问该对象,请 弱\u ptr可以使用共享\u ptr转换为共享\u ptr 构造函数或成员函数锁。上次共享的 对象消失,对象被删除,尝试获取 来自引用已删除文件的弱\u ptr实

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

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

弱类模板存储对对象的“弱引用” 这已经由共享ptr管理。要访问该对象,请 弱\u ptr可以使用共享\u ptr转换为共享\u ptr 构造函数或成员函数锁。上次共享的 对象消失,对象被删除,尝试获取 来自引用已删除文件的弱\u ptr实例的共享\u ptr 对象将失败:构造函数将引发类型为的异常 boost::bad_-weak_-ptr和weak_-ptr::lock将返回一个空值 共享\u ptr。“


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

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

跟踪垃圾收集器时要处理的最复杂的事情是遍历对象树(例如查找对“活动”对象的引用)。如果您正在为另一种语言编写解释器,这并不难,因为您可以在根对象类(或所有对象的其他公共分母)中为此连接工具。但是,如果你在C++中为C++编写了一个垃圾收集器,那么你将很难做到这一点,因为你需要检查对象内容,以找到指向其他分配的内存区域的指针。
如果您是出于教育目的编写垃圾收集器,我建议您考虑为另一种语言(不能直接访问指针的语言)编写一个解释器。如果你正在编写C++中的C++集,并打算在生产软件中使用C++,我强烈建议你使用它。另外,尽量避免循环引用。这不是一个很好的问题。当然你可以实现一个,你应该阅读一本好的编程语言书来理解垃圾收集算法是如何工作的。同意CPP:如果你仔细想想,就永远不会有真正对称的循环引用。总要有人先来。所以“圆圈”中的最后一条边应该是“弱参考”,这就解决了问题。@Michael Price:到目前为止,我找到的大多数资源只是不断地解释各种术语,没有一个真正费心给出一些例子。我真的不关心操作系统、编译器或Java语言如何收集垃圾,我关心的是我自己如何做。到目前为止,没有运气。引用计数不能准确地收集所有垃圾,如问题中所述。@Cat:“另外,尽量避免循环引用”:垃圾收集器的职责不是对程序员施加限制!如果您在没有垃圾收集器的情况下管理资源,那么这是一个很好的建议,但无助于OP实现垃圾收集器。+1-这个答案对于解决文字问题背后的问题非常有用。是的,我正在尝试解决我当前GC的问题。因为如果用户使用它来控制循环链表之类的东西,那么它就失败了。-1抵消+1:这很少是一个可行的解决方案,而且在许多数据结构(图形等)中都隐含着周期。@user1065635-是(或您的团队)用户,还是您有外部用户?