码迷,mamicode.com
首页 > 其他好文 > 详细

Copy_on_write的简单实现

时间:2017-06-17 18:32:32      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:[]   空间   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 }

 

Copy_on_write的简单实现

标签:[]   空间   his   char   null   错误   delete   存在   释放   

原文地址:http://www.cnblogs.com/m4ch0/p/7040810.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!