c++引用计数实现
2016-03-05 14:44
357 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
[cpp]
view plain
copy
print?
#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();
private:
class StringValue {
public:
int refCount;
char *data;
StringValue(const char *pdata);
~StringValue();
};
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)
delete value;
value = rhs.value;
++value->refCount;
return *this;
}
String::~String() {
if (--value->refCount == 0)
delete value;
}
void test() {
String ss("ssss");
String s1 = ss;
String s2("dddd");
s2 = ss;
}
int main() {
test();
}
原文地址:http://blog.csdn.net/sunmenggmail/article/details/8172172
[cpp]
view plain
copy
print?
#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();
private:
class StringValue {
public:
int refCount;
char *data;
StringValue(const char *pdata);
~StringValue();
};
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)
delete value;
value = rhs.value;
++value->refCount;
return *this;
}
String::~String() {
if (--value->refCount == 0)
delete value;
}
void test() {
String ss("ssss");
String s1 = ss;
String s2("dddd");
s2 = ss;
}
int main() {
test();
}
原文地址:http://blog.csdn.net/sunmenggmail/article/details/8172172
相关文章推荐
- 《编写高质量代码:改善C++程序的150个建议》读书笔记5(关于异常处理的部分)
- 学习C++反汇编-单继承
- 【学习C++】1.开始学习C++
- 1026. Table Tennis (30)
- 【C++学习之路】派生类的构造函数(三)
- 《Effective C++》Rule42: 了解 typename 的双重意义
- C++中的析构函数为什么通常为虚函数
- C语言获取系统当前时间转化成时间字符串
- C++项目文件中的后缀名为SDF的文件是什么?有什么用?
- c++primer(第五版) 第十章 泛型算法习题答案
- 【总结】逆置双向链表的三种方法
- 重拾c语言——指针与数组
- POJ1190
- C语言解释器的实现--序(零)
- C++ 17 的最新动态
- C++容器详解
- C语言调用动态库中的函数的方法(dlopen,dlsym等)
- c语言概述
- vs2013 c++項目轉 vs2008
- C/C++ 声卡编程代码