C++垃圾回收器

5

我一直在尝试在C++中创建垃圾收集器,我将其设计为所有类的基类,称为garbageCandidate,并在每个garbageCollector实例中使用一个静态向量来包含指向garbageCandidate的指针,并将“this”推送到向量中。

然后,一个静态函数会删除静态向量中的所有指针。

在删除函数的最开始(第一个指针上的删除操作)时,我收到一个错误,指出删除操作在无效的指针上被使用...

这是否与静态/动态绑定有关?我的意思是:由于我在“父”类上调用了delete,而它实际上是子类,所以delete运算符无法按预期工作吗?

是否可以通过创建虚析构函数(或虚删除函数)来避免这种情况?

还是我完全错过了什么?

附注:所有用于测试的对象都是动态创建的。


1
你在 garbageCandidate 类中将 dtor 声明为虚函数了吗? - Jerry Coffin
1
不,这与静态/动态绑定无关。 - Daniel Kamil Kozar
2
只有当析构函数不是“虚拟的”时,才会出现问题。但是没有看到任何代码很难说。你能提供一个SSCCE吗? - Joseph Mansfield
如果您通过指向基类的指针删除派生对象,则基类析构函数必须是虚拟的。 - Oliver Charlesworth
请确保您永远不要在堆栈上创建垃圾回收对象。 - David Schwartz
2个回答

0

你为什么要自己实现垃圾回收器呢?如果所有的对象都是动态创建的,那么为什么不使用 boost 的智能指针(比如 boost::shared_ptr),这种指针本质上使用了 RAII,给你提供了一个经过充分测试的垃圾回收解决方案。

我问这个问题是因为通常在项目软件开发生命周期中,你最终会在你自己编写的代码中修复 bug(至少大部分时间是这样)。所以你重复造轮子有原因吗?


因为他想要做得更好。 - peterh
我们应该了解这种心态并帮助它,或者至少让它保持平静,即使我们有其他理想。 - peterh
shared_ptr不是“垃圾回收解决方案”。 - xryl669

0

我认为你不应该自己编写垃圾回收器,而是应该使用Boehm Conservative GC或智能指针。但两者都不完美:

尽管如此,Boehm GC或智能指针中的任何一个都比自己编写解决方案需要更少的实现和维护工作。

Boehm GC 定期扫描整个堆栈以查找我们分配的指针的出现情况。即使其指针仅是一些非指针数据的随机组合,它也会认为内存片段已被分配。它还会扫描数据。我认为,BoehmGC 的唯一原因是目前没有更好的开源 C/C++ 垃圾收集器。需要编写新的垃圾收集器。 - peterh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接