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

reference counting with shared objects and reference object

本文关键字:对象 引用 共享      更新时间:2023-10-16

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

"一个

正常的"引用计数"成语涉及一个'共享对象'(与 计数)和简单的"参考对象"(不是C++参考, 尽管语义会相似)指的是共享的 对象。"引用对象"的构造函数和析构函数 负责在共享上调用 incref/decref 方法 对象。所以共享对象会自动计算数量 活动的"参考对象"。(引用计数类和多线程)

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

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 结构吗?)和引用对象(字符串类)?

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

出于这个原因,在C++11 standard library和众所周知的Boost library中具有引用计数的共享所有权在封装最常需要的所有权方案的单独模板类中实现。

Boost library这些是:

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

  • weak_ptr<T> - 一个句柄,可用于获取完整shared_ptr<T>(如果该句柄还活着)

  • * intrusive_ptr<T> - 具有引用计数的共享所有权,其中引用计数器是所管理对象的一部分。这个特殊的类是您要实现的目标的一个例子,但已经打磨到工业标准。