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 }

转载于:https://www.cnblogs.com/m4ch0/p/7040810.html

Copy_on_write的简单实现相关推荐

  1. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

  2. Linux下tomcat的安装与卸载以及配置(超简单)

    无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...

  3. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  4. Docker的安装、镜像源更换与简单应用

    Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...

  5. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  6. 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】

    博客目录(阅读时间:10分钟) 一.win10 0.系统环境 1. win10配置golang环境 ①下载相关软件 ②创建gowork工作空间 ③配置环境变量(GOPATH+PATH) ④验证环境配置 ...

  7. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  8. JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

    一.什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间.如何用最简单的方法来搭建 ...

  9. java发送简单邮件_Java程序实现发送简单文本邮件

    /** * Java程序实现发送简单文本邮件 * * @author Administrator * */ public class SendTextMail { // 定义发件人地址 public  ...

最新文章

  1. 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤
  2. arm-none-linux-gnueabi,安装交叉编译器arm-none-linux-gnueabi-gcc 过程
  3. 听说你想从事中间件开发?
  4. 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 2 )
  5. academic division at cssa
  6. VTK:可视化算法之FlyingHeadSlice
  7. Linux 大规模请求服务器连接数相关设置
  8. C/S、B/S的区别
  9. python字典程序题_急!一道关于python字典的编程题!求思路!
  10. 查看及修改当前数据库的所支持的数据库引擎以及默认数据库引擎
  11. 它们都是苹果公司背后那些英国科技 “力量”
  12. 数字图像处理--梯度倒数加权平滑法
  13. 如何配置Web服务器?web服务器配置方法步骤
  14. 真•神器:Desmos 心形曲线x4
  15. HP246 G6 笔记本升级
  16. <C++ 初阶> C++入门
  17. 前端埋点和后端埋点能分开使用吗?【数据埋点介绍】
  18. 串列配置(Tandem)在Kintex-7互联TRD中的实现
  19. MJ对2008年10月6日大盘预测(节后第一天)
  20. 通过创建动态类型 动态构建Expression Select表达式来控制Property可见性

热门文章

  1. SQL Server数据库有关语法
  2. JavaScript创建对象的三种方式之利用字面量创建对象及使用方法(1)
  3. 线段树i hate it
  4. WPF RadioButton按钮控件取消选中设置
  5. excel两个表格数据对比_教你如何使用excel快速对比多项数据
  6. bzoj 1656: [Usaco2006 Jan] The Grove 树木(BFS)
  7. bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
  8. 2017 Multi-University Training Contest - Team 4:1003. Counting Divisors(积性函数)
  9. 拓扑排序:Kahn算法
  10. 过程定义伪指令proc和宏命令伪指令macro