标签:[] 空间 his char null 错误 delete 存在 释放
Copy_on_write即写时复制,它的原理是通过引用计数来实现的.
即在分配空间时多分配额外的空间,用来记录有多少个指针指向该空间.当有新的指针指向该空间,引用计数则加一,当要释放该空间时,引用计数则减一,直到引用计数减为0时,才真正释放该空间.当有指针要改变该空间的值时,再为这个指针分配自己的空间.而我们说的引用计数,存在于堆内存中.
下面的代码将实现简单的写时复制功能,如有错误欢迎指正.
1 #include <string.h> 2 #include <iostream> 3 using std::cout; 4 using std::endl; 5 6 class String 7 { 8 public: 9 String() 10 : _pstr(new char[2]()) 11 { 12 initRefcnt(); 13 } 14 15 String(const char * pstr) 16 : _pstr(new char[strlen(pstr)+2]()) 17 { 18 strcpy(_pstr,pstr); 19 initRefcnt(); 20 } 21 22 String(const String &rhs) 23 : _pstr(rhs._pstr) 24 { 25 increaseRefcnt(); 26 } 27 28 String & operator=(const String & rhs) 29 { 30 if(this != &rhs) 31 { 32 decreaseRefcnt(); 33 if(getRefcnt()==0) 34 delete [] _pstr; 35 _pstr = rhs._pstr; 36 increaseRefcnt(); 37 } 38 return *this; 39 } 40 41 ~String() 42 { 43 decreaseRefcnt(); 44 if(getRefcnt()==0) 45 { 46 delete [] _pstr; 47 cout << "~String()" << endl; 48 } 49 } 50 51 size_t size() const 52 { 53 return strlen(_pstr); 54 } 55 56 const char * c_str() const 57 { 58 return _pstr; 59 } 60 61 size_t getRefcnt() const 62 { 63 return _pstr[size()+1]; 64 } 65 66 char & operator[](size_t idx) 67 { 68 static char nullchar = ‘\0‘; 69 if(idx < size()) 70 { 71 if(getRefcnt()>1) 72 { 73 decreaseRefcnt(); 74 char * ptmp = new char[strlen(_pstr)+2]; 75 strcpy(ptmp,_pstr); 76 _pstr = ptmp; 77 initRefcnt(); 78 } 79 return _pstr[idx]; 80 } 81 else 82 { 83 cout << "Oops-->index cruptted!" << endl; 84 return nullchar; 85 } 86 } 87 88 private: 89 void initRefcnt() 90 { 91 _pstr[size()+1]=1; 92 } 93 void increaseRefcnt() 94 { 95 ++_pstr[size()+1]; 96 } 97 void decreaseRefcnt() 98 { 99 --_pstr[size()+1]; 100 } 101 friend std::ostream & operator<<(std::ostream & os,const String & rhs); 102 103 private: 104 char * _pstr; 105 }; 106 107 std::ostream & operator<<(std::ostream & os,const String & rhs) 108 { 109 os << rhs._pstr; 110 return os; 111 }
标签:[] 空间 his char null 错误 delete 存在 释放
原文地址:http://www.cnblogs.com/m4ch0/p/7040810.html