写时拷贝技术原理
写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一,直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为这个指针重新分配自己的空间(旧的空间的引用计数减一,新分配的空间引用计数加一)。
写法一(有缺陷)
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str)+1])
,_RefCount(new int(1))
{
cout<<"String(char* str = "")"<<endl;
strcpy(_str, str);
}
String(const String& s)
:_str(s._str)
,_RefCount(s._RefCount)
{
cout<<"String(const String& s)"<<endl;
(*_RefCount)++;
}
~String()
{
if((*_RefCount)-- == 1)
{
cout<<"~String()-delete[]"<<endl;
delete[] _str;
_str = NULL;
}
}
String& operator =(String& s)
{
cout<<"String& operator =(String& s)"<<endl;
if(_str != s._str)
{
if(*_RefCount == 1)
{
delete[] _str;
delete _RefCount;
}
else
{
(*_RefCount)--;
}
_str = s._str;
_RefCount = s._RefCount;
*(s._RefCount) += 1;
}
return *this;
}
private:
char* _str;
int* _RefCount;
};
int main()
{
String s1("hello");
//String s2(s1);
//String s3(s2);
String s4("world");
String s5 = s4;
s1 = s5;
return 0;
}
写法二(有效较少代码碎片)
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str)+4+1])
{
cout<<"String(char* str = "")"<<endl;
*(int*)_str = 1;
_str += 4;
strcpy(_str, str);
}
String(const String& s)
:_str(s._str)
{
cout<<"String(const String& s)"<<endl;
*(int*)(_str-4) += 1;
}
~String()
{
if(*(int*)(_str-4) == 1)
{
cout<<"~String()-delete[]"<<endl;
delete[] (_str-4);
_str = NULL;
}
}
String& operator =(const String& s)
{
cout<<"String& operator =(String& s)"<<endl;
if(_str != s._str)
{
if(*(int*)(_str-4) == 1)
{
delete[] (_str-4);
_str = NULL;
}
else
{
*(int*)(_str-4) -= 1;
*(int*)(s._str-4) += 1;
_str = s._str;
}
}
return *this;
}
private:
char* _str;
};
int main()
{
String s1("hello");
String s2(s1);
String s3(s2);
String s4("world");
String s5 = s4;
s1 = s5;
return 0;
}