使用共享对象和引用对象引用计数

时间:2014-02-10 21:57:01

标签: c++ reference-counting

基于以下对引用计数的描述:

  

“正常”引用计数“成语涉及'共享对象'(带有   计数)和简单的'引用对象'(不是C ++引用,   虽然语义相似但是引用了共享   宾语。 “参考对象”的构造函数和析构函数   负责在共享上调用incrementf / decref方法   宾语。所以共享对象会自动计算数量   有效的'参考对象。'(reference counted class and multithreading

我有搜索互联网并找到了这个例子:

namespace Optimized {
struct StringBuf {
    StringBuf();             // start off empty
   ~StringBuf();             // delete the buffer
    void Reserve( size_t n );// ensure len >= n

    char*    buf;            // allocated buffer
    size_t   len;            // length of buffer
    size_t   used;           // # chars actually used
    unsigned refs;           // reference count
};

class String {
  public:
    String();                // start off empty
   ~String();                // decrement reference count
                             //  (delete buffer if refs==0)
    String( const String& ); // point at same buffer and
                             //  increment reference count
    void   Append( char );   // append one character
  private:
    StringBuf* data_;
 };
}

  namespace Optimized {

   StringBuf::StringBuf() : buf(0), len(0), used(0), refs(1) { }

   StringBuf::~StringBuf() { delete[] buf; }

   void StringBuf::Reserve( size_t n ) {
    if( len < n ) {
    size_t newlen = max( len * 1.5, n );
    char*  newbuf = new char[ newlen ];
    copy( buf, buf+used, newbuf );

    delete[] buf;   // now all the real work is
    buf = newbuf;   //  done, so take ownership
    len = newlen;
    }
  }

  String::String() : data_(new StringBuf) { }
  String::~String() {
  if( --data_->refs < 1 ) {
    delete data_;
      }
    }
   String::String( const String& other )
    : data_(other.data_)
    {
      ++data_->refs;
    }
 }

这个例子是否满足上述描述的条件?我的意思是,它是否涉及共享对象(在这种情况下是StringBuf结构吗?)和引用对象(String类)?

1 个答案:

答案 0 :(得分:1)

将业务逻辑与生命周期管理混合起来(几乎*)从来都不是一个好主意。

因此,在C++11 standard library和众所周知的Boost library中使用引用计数的共享所有权是在封装最常用的所有权方案的单独模板类中实现的。

Boost library中,这些是:

  • shared_ptr<T> - 使用引用计数共享所有权(当创建特定原始指针shared_ptr<T>的第一个T*实例时,将分配引用计数器。

    < / LI>
  • weak_ptr<T> - 一个句柄,可以用来获取完整的shared_ptr<T>

  • * intrusive_ptr<T> - 与引用计数共享所有权,其中引用计数器是被管理对象的一部分。这个特殊的课程就是你想要达到的目标的一个例子,但已经完成了工业标准。