c++ 深浅拷贝(必须要理解掌握)

导语:

业内流传一句话:不懂C/C++就不是真正的程序员;C/C++是程序员的骄傲,掌握C/C++是成为一名优秀程序员必备的知识底蕴和素养。–这是摘自CSDN首页的一则广告语

深浅拷贝

 必须要掌握和理解的,
  必须要掌握和理解的,
   必须要掌握和理解的,
    3遍
     连这个都搞不明白怎么好意思说自己是c++ 程序员 .......

先来看一个类

c++ 深浅拷贝(必须要理解掌握)_第1张图片

类结构就是
一个传参构造
一个拷贝构造
一个析构
一个 私有 char* 变量

c++ 深浅拷贝(必须要理解掌握)_第2张图片
这样执行会有问题吗? 来看一下

c++ 深浅拷贝(必须要理解掌握)_第3张图片

死掉了 why?

一步一步的看

在这里插入图片描述

c++ 深浅拷贝(必须要理解掌握)_第4张图片

再来看看这个拷贝构造

在这里插入图片描述

char* 的私有变量同时指向一块地址 0x00d4e3c8

指向同一块地址,那么一析构 释放内存那不炸了吗 !!!

这就是浅拷贝
浅拷贝:又称值拷贝,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的

现在我们不能让他们共用一块地址 所以要改为深拷贝

c++ 深浅拷贝(必须要理解掌握)_第5张图片
进入拷贝构造 也给他申请一块内存 和 构造一样

在这里插入图片描述
c++ 深浅拷贝(必须要理解掌握)_第6张图片

正常执行 没问题了

深拷贝,拷贝的时候先开辟出和源对象大小一样的空间,然后将源对象里的内容拷贝到目标对象中去,这样两个指针就指向了不同的内存位置。并且里面的内容是一样的,这样不但达到了我们想要的目的,还不会出现问题,两个指针先后去调用析构函数,分别释放自己所指向的位置。即为每次增加一个指针,便申请一块新的内存,并让这个指针指向新的内存,深拷贝情况下,不会出现重复释放同一块内存的错误

你可能感兴趣的:(c/c++)