intrusive_ptr:为什么不提供通用基类?

时间:2010-05-25 08:47:42

标签: c++ boost shared-ptr smart-pointers boost-smart-ptr

boost::intrusive_ptr需要定义intrusive_ptr_add_refintrusive_ptr_release。为什么不提供基类来执行此操作?这里有一个例子:http://lists.boost.org/Archives/boost/2004/06/66957.php,但海报上写着“我不一定认为这是一个好主意”。为什么不呢?

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

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

3 个答案:

答案 0 :(得分:4)

因此,您可以将intrusive_ptr用于已实现添加和释放的类。

答案 1 :(得分:3)

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

因此,您需要使ptr_addptr_release方法成为虚拟,以便派生类可以实现覆盖以同时正确地同步多个计数器......这里有一些性能损失,尤其是因为大部分时间它都是完全没有必要的(没有覆盖),因为它只对多重继承有用。

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

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

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

答案 2 :(得分:3)

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