C++的深浅拷贝和写时拷贝你了解吗_第1页
C++的深浅拷贝和写时拷贝你了解吗_第2页
C++的深浅拷贝和写时拷贝你了解吗_第3页
C++的深浅拷贝和写时拷贝你了解吗_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++的深浅拷贝和写时拷贝你了解吗目录1.浅拷贝2.深拷贝3.引用计数+写时拷贝总结

1.浅拷贝

浅拷贝:对于有申请空间的对象的类来说,是按照字节序依次拷贝过去的,并没有另外申请一块空间。因此,在调用析构函数的时候会造成同一块空间释放两次的情况,从而使程序崩溃。

如下实例:

classstring

public:

string(constchar*str)

//构造string类对象时,如果传递nullptr指针

//认为程序非法,此处断言下

assert(str);

_str=newchar[strlen(str)+1];

strcpy(_str,str);

~string()

if(_str)

delete[]_str;

_str=nullptr;

private:

char*_str;

voidtest()

strings1("linmanman");

strings2(s1);

运行看看,报错了

分析错因:

浅拷贝是指向同一块空间的,这样就会有俩个无法避免的问题:

1.析构俩次空间,程序崩溃

2.其中一个的值被修改了,会影响到另外一个的值。

深拷贝:给每个对象单独分配资源,就是给待拷贝的对象另开一片空间,再把原对象空间上的值拷贝过来,这样在调用析构函数的时候就不会产生冲突。

2.深拷贝

传统写法的string类的深拷贝是自己开空间,自己将拷贝的对象拷贝到待拷贝对象中。

string(conststrings)

:_str(newchar[strlen(s._str)+1])

strcpy(_str,s._str);

stringoperator=(conststrings)

if(this!=s)

char*pStr=newchar[strlen(s._str)+1];

strcpy(pStr,s._str);

delete[]_str;

_str=pStr;

return*this;

现代写法的string类的深拷贝堪称是移花接木

string(conststrings)

:_str(nullptr)//必须置空,因为_str开始是个随机数,交换给tmp._str后,释放会引起问题

stringtmp(s._str);//直接利用构造函数,给tmp对象开辟了一块空间

swap(tmp);

stringoperator=(strings)

swap(s);//这个swap是咱们自己写的哦

return*this;

顺带提一嘴,各个编译器深拷贝的底层实现略有差异(当然逻辑是一样的)

VS2013下的深拷贝

g++下的深拷贝

3.引用计数+写时拷贝

写时拷贝就是一种拖延症,是在浅拷贝的基础之上增加了引用计数的方式来实现的。

引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论