重新做人
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]) //初始时字符创有一个\0外加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\r\n",_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 }
http://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5751771.html
http://www.2cto.com/kf/201605/507364.html
时间: 2024-10-06 23:24:04