如何在C++中实现垃圾回收器

5

可能是重复问题:
如何在C++中实现垃圾回收

最近我在面试中被问到如何在c++中实现垃圾回收的问题。

我的答案是使用预分配的内存池并在分配的空间中构造对象。还要将分配给对象的内存大小存储在指针指向的内存位置之前的字节中。

面试官对我的答案不满意。

后来我意识到,我的解决方案实际上是试图避免垃圾回收的主要目标,即预先分配内存池并使用该内存。

但我认为,在不修改编译器的情况下,在C++中实现垃圾回收将会很困难。

有什么建议吗? 提前致谢!!!

编辑 似乎还有其他人也遇到了类似的问题,许多聪明的人在这里发表了他们的观点 here


2
这里有一个与您的查询完全匹配的答案:https://dev59.com/dG445IYBdhLWcg3wKHAJ希望能对您有所帮助。 - Dennis
1
在C++中实现垃圾回收器,还是为C++实现垃圾回收器?如果您已经编写了自己的JVM,并且您用于编写它的语言恰好是C ++,那么您可以以几乎与任何语言实现Java垃圾回收器的方式在C ++ 中实现您的Java垃圾回收器;-) - Steve Jessop
2个回答

2

我认为面试官想要的是智能指针,因为这是该语言能做到的最好的,即使如此,它仍需要程序员付出一定的注意力。从计算机科学的角度来看,这并不是合适的垃圾回收。


是的,要像JAVA GC一样为C++实现GC需要修改编译器。因此,智能指针绝对是一种方法。但是难道不正确地说,智能指针仅仅是使用放置new的内存池,实际上两者是相同的吗? - Amm Sokun
@Amm:不是的,因为智能指针做的不仅仅是那些。特别的,让它们有趣的是它们自动释放所管理的内存。 - jalf

2
你可以阅读关于 shared_ptr 结构体的内容。
它实现了一个简单的 引用计数 垃圾回收器。
如果你想要一个真正的垃圾回收器,你可以重载 new 运算符。
创建一个类似 shared_ptr 的结构体,命名为 Object。
这将包装新创建的对象。现在通过重载其运算符,你可以控制 GC。
现在你只需要实现其中一个 GC 算法 即可。

请确保用户不允许原始指针“逃逸”到持有对象的代码中,就像使用shared_ptr的用户一样。请注意,Boehm收集器比这更聪明,它使用特定于实现的堆栈和对象分析来标记/清除原始指针,而不仅仅是特殊对象。 - Steve Jessop
重载new运算符是C++中的内存池所做的事情。我也想知道如何在C++中实现引用计数? - Amm Sokun

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