2009-12-25 44 views

回答

5

使用引用计数的指针,如boost::shared_ptr。不需要对指向类的更改,但是您将被限制为动态创建类实例。

+0

谢谢,但我不想使用任何库。 – Ashish 2009-12-25 20:38:50

+2

如果不使用库,则无法使用C++。但是您可以简单地将Boost源复制到您的项目中。 – 2009-12-25 20:42:15

+0

如果你是引用计数,你总是会使用新的 – doron 2009-12-25 21:58:49

1

Wikipedia article on referencing counting指出它比我能:

引用计数超过追查垃圾收集的主要优点是,对象只要他们不再被引用的回收,并以渐进的方式,没有长时间的收集周期和明确定义的每个对象的生命周期。在实时应用程序或内存有限的系统中,这对于保持响应速度很重要。引用计数也是实现垃圾收集的最简单形式之一。它还可以有效管理非内存资源,例如操作系统对象,这些内存往往比内存稀少(追踪GC系统使用终结器,但延迟回收可能会导致问题)。加权引用计数对于垃圾收集分布式系统是一个很好的解决方案。

如果一组活动对象填充大部分可用内存,则会经常触发跟踪垃圾回收循环;它需要额外的空间才能高效。随着可用空间总量的减少,引用计数性能不会降低。 1

引用计数也是有用的信息,可用作其他运行时优化的输入。例如,严重依赖诸如许多函数式编程语言之类的不可变对象的系统可能由于频繁的副本而受到效率损失。但是,如果我们知道一个对象只有一个引用(就像在很多系统中一样),并且该引用在创建类似的新对象的同时丢失(如字符串附加语句str←str +“a” ),我们可以用原始对象上的突变来替换操作。在天真的形式

引用计数拥有追踪垃圾收集两个主要的缺点,两者都需要额外的机制来改善:

  • 它涉及到频繁更新是效率低下的一个来源。虽然跟踪垃圾收集器可以通过上下文切换和缓存线故障严重影响效率,但它们收集的次数相对较少,而访问对象则不断进行。另外,不太重要的是,引用计数要求每个内存管理对象为引用计数预留空间。在跟踪垃圾回收器时,尽管跟踪垃圾回收器,尤其是增量回收器,可能需要额外的空间用于其他目的,但该信息隐式存储在引用该对象的引用中,节省了空间。
  • 上面介绍的朴素算法不能处理引用循环,即直接或间接引用自身的对象。完全依赖于引用计数的机制将永远不会考虑循环的要删除的对象链,因为它们的引用计数保证为非零。处理这个问题的方法存在,但也会增加引用计数的开销和复杂性 - 另一方面,这些方法只需要应用于可能形成循环的数据,通常是所有数据的一小部分。一种这样的方法是使用弱引用。
2

创建一个继承自库的类并在子类中实现引用计数的子类。

0

正如Jim Bruck所说,扩展是一种机制。如果扩展不可行,那么您可以使用委托包装方法。