拷贝写

重新做人

  1 // Copy_On_Write.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <cstring>
  6 #include <string>
  7 
  8 using namespace std;
  9 
 10 
 11 #pragma region 注释
 12 
 13 //Copy On Write(写时复制)使用了“引用计数”,
 14 //会有一个变量用于保存引用的数量。当第一个类构造时,
 15 //string的构造函数会根据传入的参数从堆上分配内存,
 16 //当有其它类需要这块内存时,这个计数为自动累加,
 17 //当有类析构时,这个计数会减一,直到最后一个类析构时,此时的引用计数为1或是0,
 18 //此时,程序才会真正的Free这块从堆上分配的内存。
 19 #pragma endregion 注释
 20 
 21 #pragma region String Class
 22 class String
 23 {
 24 public:
 25     String(const char* str)                                        
 26         :_str(new char[strlen(str)+5])    //初始时字符创有一个外加4个字节的引用计数空间
 27     {
 28         (*((int*)_str)) = 1;            //申请的空间赋值为1
 29         _str += 4;                        //让_str还是指向字符创的第一个字符
 30         //而不是引用计数的头上
 31         //    strcpy(_str,str);
 32         memcpy(_str,str,sizeof(str));
 33     }
 34 
 35     String(const String& s)
 36         :_str(s._str)
 37     {
 38         (*(((int*)_str) - 1)) += 1;
 39 
 40     }
 41 
 42     String& operator=(const String& s)
 43     {
 44         if(_str != s._str)
 45         {
 46             if(*(((int*)_str) - 1) == 0)
 47             {
 48                 delete[] (_str-4);
 49             }
 50             _str = s._str;
 51             *(((int*)_str) - 1) += 1;
 52         }
 53         return *this;
 54 
 55 
 56     }
 57     String& operator+=(const String& s)
 58     {
 59         char* szBuffer = new char (strlen(_str));
 60         memcpy(szBuffer,_str,strlen(_str));
 61         if(*(((int*)_str) - 1) == 0)
 62         {
 63             delete[] (_str-4);
 64         }
 65         *(((int*)_str) - 1) += 1;
 66         memcpy(szBuffer + strlen(_str),s._str,sizeof(s._str));
 67         _str = szBuffer;
 68         return *this;
 69     }
 70     void show()
 71     {
 72         printf("%s
",_str);
 73     }
 74 
 75     ~String()
 76     {
 77         if(*(((int*)_str) - 1) == 0)
 78         {
 79             _str -= 4;
 80             delete[] _str;
 81         }
 82     }
 83 private:
 84     char *_str;
 85 };
 86 
 87 #pragma endregion String Class
 88 
 89 #pragma region Test
 90 void Test()
 91 {
 92     String s1("1");
 93     s1.show();
 94     String s2(s1);
 95     s2.show();
 96     String s3("2");
 97     s3.show();
 98     s2+=s3;
 99     s1.show();
100     s2.show();
101     s3.show();
102 }
103 
104 #pragma endregion Test
105 
106 int _tmain(int argc, _TCHAR* argv[])
107 {
108     Test();
109     return 0;
110 
111 }
View Code

 http://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5751771.html

http://www.2cto.com/kf/201605/507364.html

爱程序 不爱bug 爱生活 不爱黑眼圈 我和你们一样 我和你们不一样 我不是凡客 我要做geek
原文地址:https://www.cnblogs.com/yifi/p/5755271.html