C++的深拷贝与浅拷贝(附简单图例)#C++

原先对深拷贝浅拷贝迷迷糊糊,不太懂析构函数的作用,最近学的一个实例分享给大家,帮助理解~

两个疑问:1、析构函数的作用是什么?

                   2、深拷贝和浅拷贝有什么区别?它们二者有啥作用?

运行结果分析如下:首先调用有参构造函数,创建p1,然后输出年龄。再通过Person p2 = Person(p1); 调用拷贝构造函数创建出p2。2次析构对应着原先2次构造。

运行结果上看好像还行,但实际上面的代码有些问题。

在第15行中      m_height =new int(height);    这是通过new创建的一块在堆上的空间,需程序员手动delete释放,但是在程序运行结束后缺没有被释放掉。

测试如下: 

我们在第3行加一个全局变量指针mark,并且将mark =m_height 。

最后结果也证明事实上并没有释放掉new出来的空间。所以这时候析构函数的作用便出来了,我们需要自己写一个析构函数来释放掉我们人为new出来的堆上的一个空间。

更新之后的析构函数:

看起来好像没有问题,但是运行起来却发现出错了。

出错的原因就在这下图的的第33行代码:

本文的核心来了:接下来我通过绘图软件解释:

这时候根据原则:先构造的后析构,也就是说先构造p1,再构造p2。析构便是反过来,先析构p2,后析构p1,而析构p2的时候,会调用析构函数,这时候便通过delete操作将原先在创建p1时候new的空间给释放了,这时候结束p2析构。到了要开始准备析构p1时候,却发现指针指向的空间已经被释放了。

这也就是回答了:浅拷贝实际上只是赋值操作,p1,p2中的指针指向的还是同一块空间。产生出错的原因便是:同一空间被释放两次。那么解决的办法便是:深拷贝!

所谓深拷贝就是  既然要拷贝咱们就贯彻到底。 p2也模仿p1,自己new一块堆中的空间。

代码更改如下:

创作不易!真正能理解的话给个点赞o( ̄▽ ̄)d

  • 22
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值