写时拷贝(copy-on-write)
使用了引用计数的复制方法,在复制的时候会有一个变量来保存引用的次数,类似于:
假设A要管理S1这块空间,然后B也想要管理使用S1,写时拷贝不需要把S1复制一份再让B去管理修改,而是将B的指针指向S1这块空间,则S1就被A和B同时管理使用,减少了系统开支,提升了系统性能。
但是在程序结束调用析构函数进行释放空间的时候就会产生问题,按照构造函数与析构函数成对出现的原则,有多少次构造就会析构多少次,A和B分别构造,就会有相应的析构,但是A与B指向同一块空间,而同一块空间不可以被析构多次,这里就会产生问题,而引用计数的写时拷贝就可以解决这个问题。
解决方法:
当指向S1这块空间的指针只剩下1个或者0个时,析构函数被调用进行释放,这时候才是真正的Free这块空间,而当管理S1这块空间的指针增加时,计数就加一。
class String
{
public:
String(const char*str)//构造函数
:_str(new char[strlen(str)+1])
,_refCount(1)
{}
String(String&s)//s2(s1)
{
_str=s._str;
_rerCount=s._refCount;
++refCount;
}
~String()//析构函数
{
if(--_refCount==0)
{
delete[]_str;
}
}
private:
char*_str;
int _refCount;
}