使用共享对象和引用对象进行引用计数
reference counting with shared objects and reference object
基于下面对引用计数的描述:
"一个正常的"引用计数"成语涉及一个'共享对象'(与 计数)和简单的"参考对象"(不是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>
- 具有引用计数的共享所有权,其中引用计数器是所管理对象的一部分。这个特殊的类是您要实现的目标的一个例子,但已经打磨到工业标准。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则