您的位置:首页 > 编程语言 > C语言/C++

C++简单实现对象引用计数示例

2016-02-17 15:16 681 查看
C++简单实现对象引用计数示例

#include <iostream>
#include <stdio.h>

using namespace std;

class String {
public:
String(const char *pdata);
String(const String &rhs);
String &operator = (const String &rhs);
~String();

public: //应该使用private,但为了演示的目的而使用public
//内部类
class StringValue {
public:
StringValue(const char *pdata);
~StringValue();
public:
int refCount;
char *data;
};

StringValue *value;//所有的引用对象均共享唯一一个value,value里面实际存储data和引用次数
};

String::StringValue::StringValue(const char *pdata):refCount(1) {
data = new char[strlen(pdata) + 1];
strcpy(data,pdata);
}

String::StringValue::~StringValue() {
delete [] data;
}

String::String(const char *pdata) : value(new StringValue(pdata)) {}

String::String(const String &rhs) {//要对引用加1
value = rhs.value;
(value->refCount)++;//所有指向同一段data的对象的引用加1
}

String &String::operator =(const String &rhs) {
if (value == rhs.value)//注意,不是this == &rhs
return *this;
if(--value->refCount == 0)
{
printf("operator =[delete value] value->refCount=%d\n",value->refCount);
delete value;
}

value = rhs.value;
++(value->refCount);

return *this;
}

String::~String() {
if ( (--value->refCount) == 0 )
{
printf("~String():[delete value] value->refCount=%d\n",value->refCount);
delete value;
}
else
{
printf("~String(): value->refCount=%d\n",value->refCount);
}
}

void test() {
String ss("ssss");
printf("ss.value->refCount=%d\n",ss.value->refCount);
String s1 = ss;
printf("s1.value->refCount=%d\n",s1.value->refCount);
printf("ss.value->refCount=%d\n",ss.value->refCount);
String s2("dddd");
printf("s2.value->refCount=%d\n",s2.value->refCount);
s2 = ss;
printf("s2.value->refCount=%d\n",s2.value->refCount);
printf("ss.value->refCount=%d\n",ss.value->refCount);
}

int main() {
test();
}


运行结果如下:
ss.value->refCount=1

s1.value->refCount=2

ss.value->refCount=2

s2.value->refCount=1

operator =[delete value] value->refCount=0

s2.value->refCount=3

ss.value->refCount=3

~String(): value->refCount=2

~String(): value->refCount=1

~String():[delete value] value->refCount=0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++