深浅拷贝

拷贝构造函数

拷贝构造函数是一种特殊的构造函数,是构造函数的重载形式。
分三种形式:

  1. 不可变类型不存在深浅拷贝
  2. 浅拷贝,只拷贝对象本身,拷贝时只会增引用,不会拷贝对象中的元素
  3. 深拷贝不但拷贝对象本身,还拷贝了其中的元素。
浅拷贝

用户未显示定义,而是由系统生成的默认的拷贝构造函数,称为浅拷贝

在这里插入图片描述
在这里插入图片描述
结果
在这里插入图片描述
编译系统在我们自己没有自定义拷贝构造函数时,会在拷贝对象时候调用默认拷贝构造函数,进行浅拷贝,即对指针name拷贝后出现两个指针指向同一个内存块。所以析构时候就析构了两次,导致内存泄漏。

在这里插入图片描述
浅拷贝的对象S1 S2指向同一块内存空间,函数结束时,先销毁S2,同时也free掉了这块空间,而S1仍指向原来的地址空间,这时,S1就成为了一个野指针,程序出错。
浅拷贝的对象只是目标对象的一个引用,新对象和目标对象指向同一块内存空间,对于日期类这类不进行资源管理的类可以不用显示调用;但对于String类这类申请空间资源的类必须显示调用拷贝构造函数,否则会造成资源泄露。

深拷贝

所以在对“含有指针成员的对象”进行拷贝时,必须要自己定义拷贝构造函数,使拷贝构造后的对象指针成员有自己的内存空间,即进行深拷贝,避免内存泄漏。

深拷贝是将对象完整的从内存中拷贝出一份,从堆内存分配一个新的存放新对象,并且不会对原来对象产生影响。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果:

构造一次

拷贝构造一次

析构两次
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值