zoukankan      html  css  js  c++  java
  • 拷贝写

    重新做人

      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])    //初始时字符创有一个外加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
    ",_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 }
    View Code

     http://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5751771.html

    http://www.2cto.com/kf/201605/507364.html

    爱程序 不爱bug 爱生活 不爱黑眼圈 我和你们一样 我和你们不一样 我不是凡客 我要做geek
  • 相关阅读:
    SQL函数说明大全
    (火炬)MS SQL Server数据库案例教程
    SQL 数据库基础语句
    java 中length,length(),size()的区别
    关于webLogic启动问题
    dreamweaver读jsp时遇到的问题
    Microsoft 注册表编辑器 (regedit.exe)
    由正则表达式REGEXP_REPLACE开始
    Hello World
    Python基础目录
  • 原文地址:https://www.cnblogs.com/yifi/p/5755271.html
Copyright © 2011-2022 走看看