2011-06-17 30 views
5

可能重复:
How to implement garbage collection in C++如何在C实现一个垃圾收集++

我最近在关于如何用C实现垃圾收集++接受记者采访时问到这个问题。

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

面试官不满意答案。

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

但我认为在C++中实现垃圾回收器而不必修改编译器会很困难。

有什么建议吗? 在此先感谢!

编辑 看来,别人也来了面临类似的问题,聪明人的负载都流下了自己的看法here

+2

一个有您的查询的精确匹配的位置:http://stackoverflow.com/questions/5009869/how-to-implement-垃圾收集在c 希望可以帮助 – Dennis 2011-06-17 09:09:02

+1

在* C++中实现垃圾收集器*,或为* C++实现垃圾收集器*如果你已经编写了你的​​JVM,并且你碰巧使用过的语言是C++,那么你用C++实现Java垃圾收集器的方式与使用任何语言实现Java垃圾收集器的方式差不多; ) – 2011-06-17 09:16:13

+0

我的意思是C++中的C++为 – 2011-06-17 09:19:57

回答

2

您可以阅读关于shared_ptr结构。

它实现了一个简单的垃圾回收器reference-counting

如果你想要一个真正的垃圾收集器,你可以重载新的运算符。

创建一个类似于shared_ptr的结构体,称之为Object。

这将包装创建的新对象。现在重载其操作员,您可以控制GC。

所有你现在需要做的,只是实现的许多GC algorithms

+0

并确保用户不允许指向持有对象的“转义”代码的原始指针,与“shared_ptr”的用户相同至。请注意,Boehm收集器比这更聪明,它使用特定于实现的堆栈和对象分析来标记/扫描原始指针,而不仅仅是特殊的对象。重载新运算符的 – 2011-06-17 09:20:08

+0

是C++中的内存池所做的。我也想知道在C++中实现引用计数? – 2011-06-17 09:24:44

2

我觉得面试官在寻找智能指针因为这是语言能做到的最好即使这样,它也需要程序员的一定的关注。在CS意义上这不是合适的GC。

+0

,为了在C++中实现GC的GC,需要编译器修改。所以聪明的指针绝对是一种方式。但是,说智能指针没有其他更多的内存池使用新的位置是不正确的,事实上两者实际上是相同的? – 2011-06-17 09:19:19

+0

@Amm:不,因为智能指针的作用不止于此。特别是,它们有趣的地方在于它们自动*释放*由它们管理的内存。 – jalf 2011-06-17 09:45:51