1.浅拷贝与深拷贝的区别

浅拷贝(默认拷贝函数):将原对象或原数组的引用直接赋给新对象,新数组,新对象/新数组只是原对象的一个引用。

深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是引用

深拷贝会在堆内存中另外申请空间来储存数据,从而解决了指针悬挂问题。当数据成员中有指针时,必须要用深拷贝

(1)如果拷贝的对象里的元素只有值,没有引用,那么深拷贝与浅拷贝是相同的。

都会对原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象与原对象完全分离开。

(2)如果拷贝的对象里的元素包含引用(像一个列表中储存着另一个列表,存的就是另一个列表的引用),那么浅拷贝和深拷贝是不同的。

浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象与原对象并没有完全分离开。

深拷贝不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分开。

2.为什么要用深拷贝

在改变新的数组(对象)时,不会改变原数组(对象)

3.有指针时,必须用深拷贝

当数据成员中含有指针时,必须用深拷贝

当用浅拷贝时,新对象的指针与原对象的指针指向了堆上的同一块儿内存,新对象和原对象析构时,新对象先把其指向的动态分配的内存释放了一次,而后原对象析构时又将这块已经释放过的内存再释放一次。对同一块动态内存执行2次以上释放的结果是未定义的,所有会导致内存泄漏或程序崩溃。

所以需要深拷贝来解决问题,当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象开辟一块新的资源,而不再对拷贝对象中对其他资源的引用的指针或引用进行单纯的赋值。

4.构造深拷贝

class MyString
{
private:char *str;
public:MyString(const char *p=nullstr)//缺省构造函数:str(nullptr){if(p!=nullptr){int len=strlen(p)+1;str=new char[len];strcpy_s(str,lrn,p);}}MyString(const MyString& ms)//拷贝构造函数,深拷贝{int n = strlen(ms.str) + 1;*str = new char[n];strcpy_s = (str, n, ms.str);//int *str// this->str=new int(*ms.str)}~MyString()//析构函数{}
};

C++——深拷贝和浅拷贝相关推荐

  1. Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝

    1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...

  2. C++深拷贝与浅拷贝

    浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以 ...

  3. python的深拷贝与浅拷贝

    对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 两个变量的内容其实为一个地址,如果要在复制的同时分配新的地址则需要用到深拷贝和浅拷贝的命令 ls ...

  4. 详谈Javascript中的深拷贝和浅拷贝

    数据复制是我们编程中经常会使用到的技术,对于普通数值数据来说,复制很简单,但是对于复杂类型比如对象的复制,就会有很多需要考虑的东西,比如我们经常说到的深拷贝和浅拷贝. 浅拷贝 复制的对象和原始对象属性 ...

  5. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  6. c++深拷贝和浅拷贝

    C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数 一:两个的区别 1 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数--即浅拷贝,它能够完成成员的一一复制.当 ...

  7. 更清晰的认识对象——深拷贝与浅拷贝

    对象在引用的时候引用的是对象的地址,所以导致如果修改其中一个对象,就会对其他引用这个地址的对象进行修改,这种结果并不是我们想要的,这个时候我们就要用到深拷贝和浅拷贝去解决这个问题了. var a = ...

  8. 深拷贝与浅拷贝~动态内存释放有关

    浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如: class A{ public: A(int ...

  9. 深入浅出的“深拷贝与浅拷贝”

    js中的浅拷贝与深拷贝,只是针对复杂数据类型(object, Array)的复制问题.浅拷贝和深拷贝都可以实现在已有对象上再生出一份的作用.但是对象的实例是存储在堆内存中然后通过一个引用值只操作对象, ...

  10. Javascript中的深拷贝和浅拷贝

    文章目录 JavaScript中的变量类型 深拷贝和浅拷贝的理解 深拷贝和浅拷贝的实现方式 为什么需要深拷贝和浅拷贝 JavaScript中的变量类型 (1).基本类型 JavaScript中的基本类 ...

最新文章

  1. 2022-2028年中国亲子游行业市场分析及前瞻研究报告
  2. 手把手教你架构3d游戏引擎pdf_一个在游戏行业摸爬滚打了十几年的人,为何我对这本书情有独钟...
  3. LoadRunner界面分析(二)
  4. OSG造成屏幕闪烁,且鼠标不能操作的一行代码
  5. 8种最坑的SQL错误用法,你有没有踩过坑?
  6. 思科修复NSA报告的Nexus 交换机DoS漏洞及其它
  7. html在线测试 css,HTML+CSS测试
  8. 中文 哈工大_第六届中文语法错误诊断大赛,哈工大讯飞联合实验室再获多项冠军...
  9. 基于redis集群实现的分布式锁,可用于秒杀,定时器。
  10. GX Works2快捷键
  11. win8普通版连接远程桌面---RDPWrap
  12. Excel函数(4)日期、文本函数
  13. PCL:点云数据(*.pcd)文件格式详解
  14. Representing Long-Range Context for Graph Neural Networks with Global Attention
  15. EMOJI表情包源码
  16. Java 点击按钮下载Excel
  17. 新加坡百吉生物获5亿元投资;武田中国总部/亚洲开发中心落户上海浦东 | 医药健闻...
  18. 电脑只有飞行模式 不显示任何WiFi信号
  19. 分享几个 Github 镜像网站(亲测可用)
  20. Java 16 藏刀而来,Java 8 面不改色 | 它强任它强,我用 Java 8,嘿嘿

热门文章

  1. pythonttf字体提取_[TTF字体]提取TTF字体的轮廓(二) | 学步园
  2. easyui 文本框 显示提示信息data-options=prompt:'格式:水箱支架-京东汽配店铺-图集(大图/图集6)'...
  3. wsimport命令生成webservice客户端
  4. 16进制转8进制 两种方法先转二进制在转8进制或先转10进制在转8进制
  5. Tornado重定向(三)
  6. Java实现MySQL批量新增
  7. 2020年B证(安全员)报名考试及B证(安全员)找答案
  8. 前端css解决背景图、图片自适应的问题【通用】
  9. xray批量扫描url--xray_scan1.1
  10. 交换机配置和电脑开机自检