string类的写时拷贝与引用计数

原创 2016年08月31日 11:19:56
由于浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃。
实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数。

由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间。这种方法就是写时拷贝。在构造函数中开辟新的空间时多开辟4个字节的空间,用来存放引用计数器,记录这快空间的引用次数。


#include<iostream>  
#include<stdlib.h>  
using namespace std;  
class String  
{  
public:  
     String(char *str = "")  
      :_str(new char[strlen(str) + 5])  
     {  
          *(int *)_str = 1;  
          _str += 4;  
          strcpy(_str, str);  
     }  
     ~String()  
     {  
          if (_str != NULL)  
          {  
              _Release();  
          }  
     }  
     String(const String& str)  
     {  
          _str = str._str;  
          ++_GetRefCount();  
     }  
     String& operator=(const String& str)  
     {  
          if (this != &str)  
          {  
               _Release();  
               _str = str._str;  
               ++ _GetRefCount();  
          }  
          return *this;  
     }  
     char& operator[](int index)//写时拷贝  
     {  
   
          if (_GetRefCount()>1)//当引用次数大于1时新开辟内存空间  
          {  
               --_GetRefCount();//原来得空间引用计数器减1  
               char *str = new char[strlen(_str) + 5];  
               strcpy(str+4, _str);  
               _str = str+4;  
               _GetRefCount()++;  
          }  
          return _str[index];  
     }  
     friend ostream& operator<<(ostream& output, const String& str)  
     {  
          output << str._str;  
          return output;  
     }  
   
private:  
     int& _GetRefCount()  
     {  
          return *(int *)(_str - 4);  
     }  
     void _Release()  
     {  
          if (--_GetRefCount() == 0)  
          {  
               delete[] (_str-4);  
          }  
     }  
private:  
     char *_str;  
};  



标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

标准C++类std::string的内存共享和Copy-On-Write(写时拷贝),引用计数实现
  • Li_Ning_
  • Li_Ning_
  • 2016年05月09日 12:05
  • 1881

写时拷贝的方式实现C++中string类

写时拷贝的两种实现方式:计数器和引用计数
  • qq_33951180
  • qq_33951180
  • 2016年09月04日 22:56
  • 1089

String类详解(浅拷贝,深拷贝,引用计数,写时拷贝)

String类:标准库类型string类表示可变长的字符序列,定义在std中,专门用来管理字符串,下面一起看下它的重要考点。 一,浅拷贝       所谓浅拷贝,是指原对象与拷贝对象公用一份实...
  • snow_5288
  • snow_5288
  • 2016年10月23日 18:16
  • 4381

String类引用计数的写时拷贝

写时拷贝: 当一个对象被拷贝构造多次,在不改变内容的情况下,多个对象共用同一个空间。 如果某个对象要改变内容,就要另外开辟一块相同的空间,然后改变这个对象的_str指针,再进行写操作 #...
  • AlwenZwei
  • AlwenZwei
  • 2017年07月13日 15:15
  • 122

小结 | C++ String类的引用计数的浅拷贝、写时拷贝

引用计数的浅拷贝 写时拷贝
  • Mac_timmy
  • Mac_timmy
  • 2017年12月09日 22:03
  • 36

c++ string类深拷贝其他版本(简洁版,引用计数版,写时拷贝版)

简洁版: class String { public: String(char* pStr="") { if(pStr==NULL) { _pStr...
  • ChenMiao0924
  • ChenMiao0924
  • 2017年03月30日 15:12
  • 205

string引用计数的写时拷贝

string的各种实现:#include class String { public: String(char* str = "") :_str(new char[strlen(str) + 5...
  • Loved_computer
  • Loved_computer
  • 2017年12月23日 18:17
  • 23

String类详解(浅拷贝,深拷贝,引用计数,写时拷贝)

String类:标准库类型string类表示可变长的字符序列,定义在std中,专门用来管理字符串,下面一起看下它的重要考点。 一,浅拷贝       所谓浅拷贝,是指原对象与拷贝对象公用一份实...
  • snow_5288
  • snow_5288
  • 2016年10月23日 18:16
  • 4381

String类的浅拷贝、深拷贝、引用计数、写时拷贝

皆以s2=s1为例 浅拷贝:只是直接将s1的值拷贝过来,s1、s2共用同一块内存。 class String { public: String(const char* str) :_str(...
  • tttjp
  • tttjp
  • 2017年03月18日 18:55
  • 101

关于String类浅拷贝引用计数问题

前面我们探讨了String类中深浅拷贝问题,相比于浅拷贝来说,深拷贝的效率较低,在深拷贝中,每拷贝一个对象就需要开辟空间和释放空间,赋值运算符重载也一样需要重新开辟和释放空间。可是当拷贝和赋值的对象只...
  • gmy2016wiw
  • gmy2016wiw
  • 2017年04月08日 16:01
  • 147
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:string类的写时拷贝与引用计数
举报原因:
原因补充:

(最多只允许输入30个字)