拷贝写

重新做人

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

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

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

时间: 2024-08-06 09:28:54

拷贝写的相关文章

148_文件的拷贝

一.文件的拷贝 package edu.aeon.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * [说明]:文件的拷贝 * @author aeon * */ public class

linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍

第三章 (由于linux不区分进程和线程,所以它们在linux中被称为task,也叫任务) 总结:本章主要包括进程以及线程的概念和定义,Linux内核如何管理每个进程,他们在内核中如何被列举,如何创建,最终如何消亡.操作系统存在的意义在于运行用户程序,进程管理是所有操作系统的心脏所在. 3.1进程 进程是处于执行期的程序,是正在执行的程序代码的实时结果.但不仅局限于一段可执行的代码,还包括其他资源(打开的文件,挂起的信号,内核内部数据,处理器的状态,一个或者多个内存映射的内存地址空间,一个或者多

Core Data的使用(二)备

一.基础概念深入 1.NSManagedObjectContext 被管理数据上下文就像便笺簿 当从数据持久层获取数据时,相当于把这些临时的数据拷贝写在便笺簿上,然后就可以随心所欲的修改这些值. 通过上下文,可以对数据记录NSManagedObject进行添加删除更改,记录更改后支持撤销和重做. 除非你保存这些数据变化,否则持久层的东西是不会变化. 通常我们将 controller 类或其子类与 Managed Object Context NSManagedObjectContext绑定,这样

IOS-Core Data的使用

二.Core Data的使用(一) CoreData 1.  常用类和方法   ( 注意需要导入   coredata  框架   ) 表结构:NSEntityDescription 表记录:NSManagedObject 数据库存放方式:NSPersistentStoreCoordinator(持久化存储协调者) 数据库操作:NSManagedObjectContext(被管理的对象上下文) 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLit

简历复印—原型模式

<大话设计模式>书中描述原型(Prototype)模式: 原型模式(Prototype):用用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式(Prototype Pattern)结构图 这种形式涉及到三个角色: 客户(Client)角色:客户类提出创建对象的请求. 抽象原型(Prototype)角色:这是一个抽象角色,通常由Java接口或Java抽象类实现.此角色给出所有的具体原型类所需的接口. 具体原型(Concrete Prototype)角色:被复制的对象.此角

CoreData学习:Core Data Stack(Swift)

Core Data是苹果官方提供的一套框架,用来解决对象生命周期管理.对象关系图管理和持久化等方面相关的问题.Core Data是模型层的技术,Core Data帮助你构建代表程序状态的模型层.Core Data也是一种持久化技术,它可以将模型的状态持久化到磁盘.但它更重要的特点是:Core Data不只是一个加载和保存数据的框架,它也能处理内存中的数据. 什么是Core Data? 对于Core Data框架将经常困惑,以为是数据库.其实Core Data并不是数据库.如果它不是数据库,那么C

rsync同步方式

远程拷贝写格式rsync -av SRC(源) DEST(目的)                               #本地目录同步rsync -av SRC(源)  [email protected]: DEST(目的)           #主机源到目的同步rsync -av [email protected]:SRC(源)  DEST(本地目的)     #远程目的到源同步rsync -av SRC(源) [email protected]:: DEST (目的)         

深克隆

利用串行化来做深复制 把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序师圈子里又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行化(Deserialization)过程则叫做“解冻”或者“回鲜(depicking)”过程.应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面,因此“腌成咸菜”的只是对象的一个拷贝,Java咸菜还可以回鲜. 在Java语言里深复制一个对象,常常可以先使对象实现Serializab

CopyOnWriteArrayList源码解析

CopyOnWriteArrayList是java1.5版本提供的一个线程安全的ArrayList变体. 在讲解5.1.1ArrayList的时候,有说明ArrayList的fail-fast特性,它是指在遍历过程中,如果ArrayList内容发生过修改,会抛出ConcurrentModificationException. 在多线程环境下,这种情况变得尤为突出,参见测试代码(代码基于java8): ArrayList<Integer> list = new ArrayList<>