原先对深拷贝浅拷贝迷迷糊糊,不太懂析构函数的作用,最近学的一个实例分享给大家,帮助理解~
两个疑问: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