写时拷贝--Copy On Writ

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class String
{
public:
 String(char *str = "") :_str(new char[strlen(str)+5])
 {
  _str += 4;
  _GetRefCount(_str) = 1;
  strcpy(_str, str);
 }
 String( String &s) :_str(s._str)
 {
  ++_GetRefCount(s._str);
 }
 int&  _GetRefCount( char* _str)
 {
  return *(int *)(_str - 4);
 }
 String & operator=(String & s)
 {
  if (_str != s._str)
  {
   Release();
   _str = s._str;
   ++_GetRefCount(s._str);
  }
  return *this;
 }
 char &operator[](size_t index)
 {
  if (_GetRefCount(_str) > 1)
  {
   char *tmp = new char[strlen(_str) + 5];
   tmp += 4;
   strcpy(tmp, _str);
   _GetRefCount(tmp) = 1;
   --_GetRefCount(_str);
   _str = tmp;
  }
  return _str[index];
 }
 void Release()
 {
  if (--_GetRefCount(_str) == 0)
  {
   delete[](_str - 4);
   cout << "delete" << endl;
  }
 }
 ~String()
 {
  Release();
 }
private:
 char *_str;
};
void test1()
{
 String s1("Hello world");
 String s2(s1);
 String s3(s1);
 String s4(s1);
 s1[0] = 'M';
 
 String s5("asdasdasdas");
 s5 = s1;
}
int main()
{
 test1();
 system("pause");
 return 0;



wKioL1bi4DbzjklWAAApeqU6cno999.png


写时拷贝:  给类增加一个引用计数,拷贝的时候增加一个引用计数,在对类成员进行拷贝时候,只给之前的引用计数加1,析构条件为当引用计数为1 的时候,要对对象进行修改的时候再创建一份新的对象进行修改并改变指针指向