引用计数

时间:2011-02-26 22:14:30

标签: c++

在我目前的项目中,许多遗留代码被设计为使用引用计数。我知道它背后的基本思想。但是我想增强我对这个领域的知识,因为我必须在我的日常编码任务中开始使用引用计数。

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

谢谢

4 个答案:

答案 0 :(得分:2)

这很简单,真的。

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

如果您传递了其中一个对象并希望将其保留的时间超过函数的生命周期,则将引用计数加1。这称为“保持引用”,并阻止对象发生被释放。例如,如果将其插入集合中,或者稍后将使用它,或者在另一个线程中使用它。 [Nota bene:如果你在多个线程中使用它,你需要确保计数的增量/减量是用原子操作完成的。]

如果您负责增加引用计数(或者如果您是首先分配对象的那个),则在不再需要指针时减少引用计数,并且不关心它是否获得自由。

如果引用计数达到零,则取消分配。

引用计数有一些缺点:

  • 您不能拥有包含周期的数据结构。如果A有对B的引用而B有对A的引用,则A和B的引用将永远不会为零。有一些策略可以避免这种情况,但仍然有圆形结构,但它们非常复杂。

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

  • 出现问题时很难调试。您可以看到内存泄漏,双重免费或免费使用,但在崩溃时不会立即清楚谁不适当地修改了引用计数。

答案 1 :(得分:0)

答案 2 :(得分:0)

您可能已经看到的是侵入式引用计数,其中必须专门设计类,以便可以对其对象进行引用计数。如果您使用非侵入式引用计数,而不是boost::shared_ptr<T>使用

,则无需任何特殊预防措施。

您可以阅读documentation at Boostcurrent C++0x standard draft或第20.9.10.2节。

答案 3 :(得分:0)

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