垃圾收集C++中的库

And*_*son 65 c++ garbage-collection libraries

什么免费和商业垃圾收集库可用于C++,每个库的优缺点是什么?

我对来自该领域实际使用的来之不易的教训感兴趣,而不是营销或宣传模糊.

没有必要详细说明与自动垃圾收集相关的常规权衡,但请提及所使用的算法(引用计数,标记和扫描,增量等)并简要总结后果.

Gre*_*ill 27

我过去使用过Boehm收藏家并取得了很大的成功.它是开源的,可用于商业软件.

它是一个保守的收藏家,并且由垃圾收集技术领域最重要的研究人员之一拥有悠久的发展历史.


Tom*_*eys 22

Boost有很多智能指针,可以引用引用计数或删除范围退出或侵入引用计数.这些已经证明足以满足我们的需求.一个很大的优点是它都是免费的,开源的,模板化的C++.因为它是引用计数,在大多数情况下,当对象被破坏时它是高度确定的.

  • @Tom Leys - 应该记住,引用计数智能指针不是GC的实现.它们不会自动处理循环引用,并且在实际应用中它们具有较差的性能(大量不必要的簿记,所有这些都在最重负载时而不是在空闲时执行). (9认同)
  • GACK.Auto_ptr应该被拖出谷仓后面并开枪.它有它的用途,但是孩子:永远不要混合auto_ptr和集合.坏juju结果. (7认同)
  • 我还质疑`shared_ptr`是有用的"确定性"的想法.本地对象实例上的析构函数确定性地运行 - 我们知道它在退出封闭块时执行.但是在与`shared_ptr`相同的情况下,我们所知道的是refcount已经减少了.`shared_ptr`的重点是我们不知道该对象是否仍然需要在其他地方使用,因此我们无法在本地确定它何时被销毁.如果在退出某个范围时需要关闭"文件句柄"对象,请不要使用`shared_ptr`. (5认同)

Pie*_*ter 9

Boehm垃圾收集器是免费提供的,据说相当不错(没有亲自体验)

([PDF警告]关于Boehm垃圾收集器的C++ 0x提议的理论论文)

它最初被称为制作C++ 0x ,但毕竟不会制作它(由于我想的时间限制).

Proprosal N2670(对垃圾收集器的最小支持)确实在2008年6月获得批准,因此当编译器实现接受这个,并且标准最终确定时,C++的垃圾收集世界肯定会改变......


Pau*_*gar 9

我经常使用boehm-gc.它很简单,但文档很差.有一个C++页面,但很难找到.

基本上,您只需确保每个类都继承自其基类,并始终将gc_allocator传递给容器.在许多情况下,您希望使用libgccpp来捕获new和delete的其他用法.这些是很大程度上的高级更改,我们发现我们可以使用#ifdef在编译时关闭GC,并且支持它只会影响一个或两个文件.

我的主要问题是你不能再使用Valgrind了,除非你先关掉收集器.虽然关闭收集器很容易做到,并且不需要重新编译,但如果你开始耗尽内存,显然不可能使用它.