string类的写时才拷贝(Copy-On-Write)

  1. 写时才拷贝(Copy-On-Write)的原理是什么?

    Copy-On-Write,其实是使用了一个计数器。当第一个类构造时,计数器初始值为1,string类的构造函数会根据传入的参数从堆上分配内存,当其他类需要这块内存时,这个计数器自动累加。当有析构函数时,这个计数器会减1,直到当计数器为1时,即最后一个类析构。此时,程序才会真正的delete这块从堆上分配的内存。

2.  string在什么情况下会发生写时才拷贝(Copy-On-Write)?

当string类中发生内存共享且内容发生改变时,会触发写时才拷贝(Copy-On-Write)。比如string类的[]、=、+=、+操作符。

3.  string类在什么情况下会发生内存共享?

如果一个类需要用另一个类的数据,那就可以共享被使用类的内存了。

使用别的类的数据时,有两种情况:

(1)用别的类构造自己;调用拷贝构造函数。

(2)以别的类赋值;调用重载赋值操作符函数。

4. 写时才拷贝的实现:

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

using namespace std;

class String

{

public:

String(char* str = "")

:_str(new char[strlen(str)+1])

,_pcount(new int(1))

{

strcpy(_str,str);

}

~String()

{

if(_str != NULL)

{

if(--*_pcount == 0)

{

delete[] _str;

delete _pcount;

}

}

}

String(const String& str)

{

_str = str._str;

_pcount  = str._pcount;

++(*_pcount);

}

String& operator=(const String& str)

{

if(this != &str)

{

if(--(*_pcount) == 0)

{

delete[] _str;

delete _pcount;

}

_str = str._str;

_pcount = str._pcount;

++(*_pcount);

}

return *this;

}

private:

char* _str;

int* _pcount;

};

int main()

{

String str1("hello");

String str2(str1);

String str3;

str3 = str1;

return 0;

}

注:str1,str2,str3共享同一块内存。

string类都是在堆上动态开辟空间的,我们在开辟空间的同时多开辟一个整型空间来存放计数器。所有共享同一个内存的类都使用同一个计数器。

实现:

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

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)

{

if(--*(int *)(_str-4)==0)

{

delete[] (_str-4);

}

}

}

String(String& str)//拷贝构造

{

_str = str._str;

++*(int *)(_str-4);

}

String& operator=(String &str)

{

if(this != &str)

{

if(--*(int *)(_str-4) == 0)

{

delete[] (_str-4);

}

_str = str._str;

++*(int *)(str._str-4);

}

return *this;

}

private:

char *_str;

};

int main()

{

String str1("zhang");

String str2(str1);

str1.operator [](3);

/*String str2;

str2 = str1;

String str3("ccccc");

String str4;

str4 = str3;*/

//str3 = str1;

return 0;

}

时间: 2024-10-16 09:25:20

string类的写时才拷贝(Copy-On-Write)的相关文章

string类的写时拷贝

由于浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃. 实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数. 由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间.这种方法就是写时拷贝. 在构造函数中开辟新的空间时多开辟4个字节的空间,用来存放引用计数器,记录这快空间的引用次数. [cpp] view plain copy #inc

模仿实现C++库函数----String 类----用 写时拷贝 &nbsp; 实现

#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<assert.h> #define DEFAULTNUME 3 using namespace std; class String { public: int& GetCount() { return *(((int *)_str) - 1); } char* GetStr() { return _str; } //找到字符 ch  并返回它的下标 i

String类的实现与深浅拷贝问题

C++实现string类是理解类和对象这个概念的基础,也能了解C++语法的特性--用户对内存的自主管理,通过类创建出一个对象的过程,首先要调用构造函数,经过一系列的操作,当退出对象所在的作用域时,便会调用析构函数,C++支持隐式的调用构造.析构等函数,但经常隐式调用并不能正确的管理内存,所以我们需要重写这两个函数,以及拷贝构造,和赋值运算符的重载. string类的结构设计 string类型的设计源于我们队字符串操作及封装的需求,所以string类是对C语言中的字符串进行优化故设计代码如下: c

php变量之写时复制机制(copy on write)

编程思想虽然可以共用,不过语言间的差异还是比较明显的,只是使用者之间没有意识到而己,而了解其中的差异对于编写程序以及把握性能还是有好处的.下面我们来介绍下PHP的一个很重要的机制copy on write,我们先以最简单的变量来介绍这个机制,在说这个之前,笔者先来介绍下弱类型是怎么实现的. 大家都知道,PHP是由C实现的,可是C是强类型语言,PHP怎么做到弱类型语言.一起来看下,PHP变量在C语言低层中的代码, typedef struct _zval_struct zval; typedef

从String类看写C++ class需要注意的地方

#include <iostream> #include <string.h> using namespace std; class String { char* m_data; public: String(const char* p = NULL) { if(p == NULL) { m_data = new char[1]; *m_data = '\0'; } else { m_data = new char[strlen(p) + 1]; strcpy(m_data, p)

C++ String 写时拷贝

当类里面有指针对象时,采用简单的赋值浅拷贝,使得两个指针指向同一块内存,则析构两次,存在内存奔溃的问题,因此浅拷贝中利用引用计数. //引用计数浅拷贝 class String { public:  String(char*str = "")   :_str(new char[strlen(str) + 1])   , _pRefCount(new int(1))  {}  String(const String & s)   :_str(s._str)   , _pRefCo

全面深入介绍C++字符串:string类

http://blog.csdn.net/liuliming3000/article/details/1809385 1 从C到C++ string类 2 string类的构造函数 3 string类的字符操作 4 string的特性描述 5 string类的输入输出操作 6 string的赋值 7 string的连接 8 string的比较 9 string类的查找函数 10 string类的替换函数 11 string类的插入函数 12 string类的删除函数 13 string类的迭代器

写时拷贝(copy-on-write) COW技术

时间:2014.05.06 地点:基地二楼 ---------------------------------------------------------------------------------- 一.写时拷贝的概念--COW技术在Linux进程上的应用 Linux在使用fork()函数进程创建时,传统fork()的做法是系统把所有的资源复制给新创建的进程,这种方式不仅单一,而且效率低下.因为所拷贝的数据或别的资源可能是可以共享的.现在Linux的fork()使用写时拷贝页来实现新进

PHP &quot;数组变量&quot;之&quot;写时复制的要点&quot; 只有数组才有的概念。

1.如果数组指针位置非法,复制时,会将新数组指针初始化! 2.值传递时,PHP采用了一个COW(写时复制,copy on write)的优化措施! 写时复制的两个要点: <?php $arr1 = array('吕布','赵云','典韦'); end($arr1);next($arr1); //非法了 $arr2 = $arr1; //复制数组////var_dump($arr2);echo '<br>';var_dump(current($arr2));//初始化$arr2