#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();
}c++引用计数实现
最新推荐文章于 2025-09-05 22:18:56 发布
本文介绍了一种基于C++实现的字符串池化技术,通过使用引用计数来避免重复字符串的多次创建与销毁,从而提高了内存管理和字符串操作的效率。文章详细展示了String类的设计与实现,包括构造函数、拷贝构造函数、赋值运算符重载以及析构函数等关键部分。
1538

被折叠的 条评论
为什么被折叠?



