有哪些可用于C++的垃圾收集器?

6

有哪些适用于C++的垃圾回收器?您是否正在使用其中之一?取得了什么结果?


一般情况下不需要垃圾回收器,因为C++智能指针更优秀且提供确定性销毁。如果您有特定的“使用案例”需要垃圾回收,则也许我们可以更周到地回答这个问题。 - Martin York
@Martin - 你的评论看起来像是一个答案。你应该发布它,这样人们才能适当地投票。 - Aaron
Boehm曾经为ISO C++委员会就GC(2004年左右,当时智能指针已经很出名了)做过演讲,因此马丁的观点不应该被陈述为事实。 - MSalters
@MSalters:别误会我的意思。在C++中,GC有其适用的场景。但智能指针通常更受欢迎。因此,需要使用GC的情况是专门的。因此,要回答“什么结果”的问题,您需要了解为什么需要GC。 - Martin York
1
智能指针不定义任何特定的语义(它们可能是非确定性的,或者永远不会销毁任何东西)。像shared_ptr这样的特定实现确实定义了语义 - 它们不是通用的,因为它们不能处理循环引用。 - Daniel Earwicker
6个回答

6

Boost库包含一些shared_ptr的内容,基本上充当引用计数垃圾回收器。如果你采用C++设计的RAII原则,那么它和auto_ptr将满足你对“垃圾回收器”的需求。


1
不过如果你想要建模循环引用,就不能这样做。 - Daniel Earwicker
@DanielEarwicker:实际上Boost也包含了weak_ptr,以解决这个问题。 - Joseph Garvin
@JosephGarvin 确实如此 - 但是你必须选择正确的一个。使用GC,您不需要这样做(这就是OP所问的)。 - Daniel Earwicker

5

维基百科上列出了几种C++垃圾回收机制

然而,我不使用任何一种,RAII也是我的好朋友。


5
Boehm垃圾收集器对于C语言来说非常好用,但在C++下使用会有些棘手。请查看“C++接口”部分,网址为:http://www.hpl.hp.com/personal/Hans_Boehm/gc/gcinterface.html
我认为,如果您需要垃圾回收,请选择内置此功能的语言。
对于C++而言,最好的通用解决方案是使用共享指针(例如来自boost),并处理循环依赖关系。您可以采取以下两种措施: 1.设计无循环依赖的事物 2.设计带有“枢纽”的事物,以打破循环并允许回收对象
您要么使用C++垃圾收集器处理真正糟糕、复杂、难以调试的问题,要么处理更简单的经典问题:在使用完对象后释放它们。

4

我个人只听说过Boehm垃圾回收器,我相信还有其他的,但我没有处理过它们(也没有寻找它们)。


2

总之,有C++/CLI这个针对.NET框架的C++语言,那里的垃圾回收做得相当不错。

尽管说实话,由于其中加入了许多语法糖,你几乎可以将其视为一种全新的语言,它只是刚好能够与C/C++很好地配合使用。

如果您不固执于C++作为编程语言,也可以考虑D,它像C++一样编译成本地代码(与C++ / CLI不同),但也具有垃圾回收功能。


2

您可以在这里找到几个实现。我从未尝试过它们中的任何一个,总的来说,我认为非确定性GC带来的伤害大于好处。


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