8

boost::intrusive_ptr需要intrusive_ptr_add_refintrusive_ptr_release被定义。为什么不提供可以做到这一点的基类?这里有一个例子:http: //lists.boost.org/Archives/boost/2004/06/66957.php,但海报说“我不一定认为这是个好主意”。为什么不?

更新:我认为这个类可能与多重继承一起被滥用这一事实是不够的。任何从具有自己的引用计数的多个基类派生的类都会有同样的问题。这些引用计数是否通过基类实现没有区别。

我认为多线程没有任何问题。boost::shared_ptr提供原子引用计数,这个类也可以。

4

3 回答 3

4

这样您就可以将 intrusive_ptr 与已经实现添加和释放的类一起使用。

于 2010-05-25T10:08:50.843 回答
4

Boost为此提供了便利。它可以配置为线程安全或线程不安全的引用计数:

#include <boost/intrusive_ptr.hpp>
#include <boost/smart_ptr/intrusive_ref_counter.hpp>

class CMyClass
    : public boost::intrusive_ref_counter<
                               CMyClass,
                               boost::thread_unsafe_counter>
     ...

boost::intrusive_ptr<CMyClass> myPtr;

http://www.boost.org/doc/libs/1_62_0/libs/smart_ptr/intrusive_ref_counter.html

于 2016-10-07T22:39:16.147 回答
3

问题在于多重继承。如果您从实现此基础的 2 个对象继承,那么您的单个对象有 2 个计数器……这可能会造成严重破坏。

因此,您需要将ptr_addandptr_release方法设为虚拟,以便派生类可以实现覆盖以一次正确同步多个计数器......这里有一些性能损失,特别是因为大多数时候它是完全没有必要的(会有不能覆盖),因为它毕竟只对多重继承有用。

当然,在多线程环境中,您可以(在短时间内)使计数器不同步(第一个增加但线程在第二个之前被中断)我还没有想到它可能导致的任何问题,但它是不是一个理智的情况。

您还给类添加了混乱,一些客户端可能根本不需要引用计数(如果他们在堆栈上创建对象)。

我认为这不是一个好主意;)

于 2010-05-25T09:26:55.013 回答