2011-02-26 64 views
1

在我目前的项目中,许多遗留代码被设计为使用引用计数。我知道它背后的基本理念。但我想提高我对这方面的知识,因为我必须开始在日常编码任务中使用引用计数。引用计数

有没有一本好书或资源向我展示如何使用或如何设计一个好的框架/采用引用计数的类。

谢谢

+1

我能想到的最大和最流行的系统是使用引用计数作为其资源管理策略是COM,它是Windows的一部分。可能想尝试四处寻找资源(虽然,COM不仅仅是重新计数;) – 2011-02-26 22:16:40

+0

讨厌陈述明显但维基(http://en.wikipedia.org/wiki/Reference_counting)是一个良好的资源。 – Lou 2011-02-26 22:19:32

+0

我绝对同意@Mike。 COM引用计数是经过深思熟虑的,找到涵盖引用计数中的线程安全以及如何处理周期等问题的实现相对比较容易。 – 2011-02-26 22:33:43

回答

0

什么你可能已经看到的是侵入性引用计数其中类必须专门设计,以便它的对象可以被引用计数。如果您采用非侵入式引用计数代替boost::shared_ptr<T>,则不需要任何特殊的预防措施。

您可以阅读current C++0x standard draftdocumentation at Boost或第20.9.10.2节。

+0

请注意,使用C++ 0x std :: make_shared,shared_ptr可以变得和插入式引用计数一样高效。虽然承认这是一个QOI问题(实施不需要付出努力)。 – 2011-02-26 22:24:23

0

要添加到其他答案,请查看有关自定义删除程序和管理COM对象的boost::shared_ptr手册部分。当最后一个shared_ptr参考消失时,可以让引用计数自动递减,从而防止出现许多错误。您也可以使用boost::intrusive_ptr,它是为具有自己引用计数管理的对象而设计的。

2

这很简单,真的。

在你的结构中你有一个整数。当对象被分配它开始时为1

如果你通过这些对象之一,你希望保留它比你的函数的寿命更长,可以通过1凹凸引用计数这是已知的作为“持有参考”,并防止对象被释放。例如,如果您将其插入到集合中,或将在稍后或另一个线程中使用它。 [注意:如果你在多个线程中使用它,你需要确保计数的增加/减少是用原子操作完成的。]

如果你是负责增加引用计数(或者如果你是一个谁首先分配了这个对象),当你不再需要这个指针时就减少引用计数,并且不关心它是否被释放。

如果引用计数达到零,你去分配。

也有一些缺点,引用计数:

  • 你不能在他们的周期数据结构。如果A具有对B的引用并且B具有对A的引用,则A和B的引用将永远不会归零。有一些策略可以避免这种情况,但仍然具有圆形结构,但它们非常复杂。

  • 在多线程程序中,递增和递减需要原子读取 - 修改 - 写入指令,这可能会很慢。这是特别糟糕的,因为使用引用计数的程序通常会非常频繁地更改引用计数,并且在多个线程中使用原子操作是一个问题。

  • 出现问题时很难调试。您可以看到内存泄漏,双免费或免费后使用,但是在崩溃时不恰当地修改引用帐号时不会立即清除内存泄漏。