为对象启用共享所有权支持

时间:2016-02-28 23:20:45

标签: c++ c++11 boost stl smart-pointers

我为具有以下控制块结构的类启用了简单的共享所有权

template <class C>
struct Ptr
{
    C* value_ ;
    size_t ref_ ;
    IdType id_ ;
};

Ptr<Payload>* ptr_ ;

value_是具有共享所有权的有效负载,

id_是将值链接到数据库行的数据库ID。它可以存在或不存在有效载荷,这就是为什么它不是有效载荷的一部分而是控制块的一部分,

ref_是参考计数器。

以下功能允许取得所有权并释放它:

template<class C>
void ptr<C>::free()
{
    if(ptr_)
    {
        ptr_->ref_-- ;
        if(ptr_->ref_==0)
        {
            delete ptr_->value_ ;
            delete ptr_ ;
            ptr_ = nullptr ;
        }
    }
}

template<class C>
void ptr<C>::take()
{
    if(ptr_)
        ptr_->ref_++ ;
}

这很有效,但我需要更进一步,因为它不能满足我的需求:

  1. 这不符合shared_ptr标准,因为我的控制块不是线程安全的,我的所有权操作不是原子的
  2. 我需要添加弱的所有权支持。这很简单,因为我只需要有一个第二个计数器,并且只有当所有计数器都降到0时才删除控制块。
  3. 我对所有权行为的需求已经被C ++ 11智能指针所涵盖,但它们并不是为了继承而设计的,并且无法自定义控制块。

    我试图了解如何使用boost和标准库来处理原子性,但现在这是相对神秘的。

    所以问题很简单,Boost或STL是否有办法在对象核心设计中实现共享所有权支持,并通过这种方式符合C ++标准?

0 个答案:

没有答案