垃圾收集器c++; 我一直试图在C++中创建垃圾回收器,我把它设计成一个基类,叫做GARBACECONDIDENT,它包含一个静态向量,它包含指向GARBACKECANDATE的指针,每个向量都在向量上推“这个”。

垃圾收集器c++; 我一直试图在C++中创建垃圾回收器,我把它设计成一个基类,叫做GARBACECONDIDENT,它包含一个静态向量,它包含指向GARBACKECANDATE的指针,每个向量都在向量上推“这个”。,c++,garbage-collection,C++,Garbage Collection,然后一个静态函数来删除静态向量中的所有指针 在删除函数(在第一个指针上删除)的一开始,我就收到一个错误,说明delete在无效指针上使用 这与静态/动态绑定有关吗?我的意思是:由于我在一个“父”类上调用了delete,而它实际上是一个子类,所以delete操作符是否不能按预期操作 避免这种情况的一种方法是创建虚拟析构函数吗?(或虚拟删除功能) 还是我完全错过了什么 ps:用于测试的所有对象都是动态创建的。您为什么要运行自己的自定义垃圾收集器?如果所有对象都是动态创建的,那么为什么不使用boost

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

在删除函数(在第一个指针上删除)的一开始,我就收到一个错误,说明delete在无效指针上使用

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

避免这种情况的一种方法是创建虚拟析构函数吗?(或虚拟删除功能)

还是我完全错过了什么


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

您为什么要运行自己的自定义垃圾收集器?如果所有对象都是动态创建的,那么为什么不使用boost的智能指针(比如)呢?它本质上是用来为您提供经过良好测试的垃圾收集解决方案的


我这样问是因为通常在项目的软件开发生命周期中,您最终会修复自己编写的代码中的错误(至少在大多数情况下是这样)。那么,你发明轮子有什么原因吗?

我认为你应该使用或智能指针,而不是滚动你自己的GC。两者都不是完美的:

  • Boehm Collector要求您使用特殊的allocate和(如果您使用)deallocate方法,而让现有库发挥作用可能需要一些努力:

  • 每次为变量分配指针时,智能指针都会增加开销。它们不处理具有指针循环的对象网络。您需要手动中断这些周期,以允许收集可从它们访问的对象


尽管如此,Boehm GC或Smart Pointer的实现和维护工作量都比滚动您自己的解决方案要少。

您是否在
garbageCandidate
类中使dtor虚拟?不,它与静态/动态绑定无关。只有在析构函数不是
虚拟的情况下才会出现问题。但是很难说没有看到任何代码。你能想出一个方法吗?如果你通过指向基的指针删除派生对象,那么基本析构函数必须是虚拟的。确保你永远不要在堆栈上创建垃圾收集对象。因为他想做得更好。我们应该了解这种心态并帮助它——或者至少让它平静下来——即使我们有其他的理想。shared_ptr不是“垃圾收集解决方案”.Boehm GC定期对整个堆栈和堆进行爬网,以查找malloced指针的出现。它会认为内存片段已分配,即使其指针只是一些非指针数据的随机组合。它也会抓取数据。我认为,BoehmGC背后的唯一原因是目前没有更好的开源c/c++垃圾收集器。它需要写出来。