基于以下对引用计数的描述:
“正常”引用计数“成语涉及'共享对象'(带有 计数)和简单的'引用对象'(不是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类)?
答案 0 :(得分:1)
将业务逻辑与生命周期管理混合起来(几乎*)从来都不是一个好主意。
因此,在C++11 standard library
和众所周知的Boost library
中使用引用计数的共享所有权是在封装最常用的所有权方案的单独模板类中实现的。
在Boost library
中,这些是:
shared_ptr<T>
- 使用引用计数共享所有权(当创建特定原始指针shared_ptr<T>
的第一个T*
实例时,将分配引用计数器。
weak_ptr<T>
- 一个句柄,可以用来获取完整的shared_ptr<T>
* intrusive_ptr<T>
- 与引用计数共享所有权,其中引用计数器是被管理对象的一部分。这个特殊的课程就是你想要达到的目标的一个例子,但已经完成了工业标准。