写时拷贝:引入一个计数器,每片不同内容的空间上都由一个计数器组成,在构造第一个类指向时,计数器初始化为1,之后每次有新的类也指向同一片空间时,计数器++;在析构时判断该片空间对应计数器是否为1,为1则执行清理工作,大于1则计数器-1。如果有需要进行增删等操作时,再拷贝空间完成,有利于提高效率。
#include<iostream>
using namespace std;
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str) + 1])
, _refCount(new int(1))
{
strcpy(_str, str);
}
String(String& s)
{
_str = s._str;
_refCount = s._refCount;
++(*_refCount);
}
{
public:
String(char* str = "")
:_str(new char[strlen(str) + 1])
, _refCount(new int(1))
{
strcpy(_str, str);
}
String(String& s)
{
_str = s._str;
_refCount = s._refCount;
++(*_refCount);
}
~String()
{
if ((--(*_refCount)) == 0)
{
delete[]_str;
delete _refCount;
printf("delete: 0x%p\n", _str);
}
}
private:
char* _str;
int* _refCount;
};
{
if ((--(*_refCount)) == 0)
{
delete[]_str;
delete _refCount;
printf("delete: 0x%p\n", _str);
}
}
private:
char* _str;
int* _refCount;
};
void TestString()
{
String s1("hello");
String s2(s1);
String s3(s2);
String s4(s1);
String s5("world");
String s6(s5);
String s6(s5);
}
int main()
{
TestString();
return 0;
}
{
TestString();
return 0;
}