图解深拷贝和浅拷贝

定义

浅拷贝:只发生了值本身拷贝,指针指向的还是同一个地址,没有产生资源拷贝。
深拷贝:不仅发生指针本身拷贝,还产生了新的资源分配,指针指向不同地址。

为什么要区分深拷贝和浅拷贝

c++primer中曾提到,如果不主动写拷贝构造函数和赋值函数,这两函数会被编译器以位拷贝(浅拷贝)的方式自动生产缺省参数,假如类中含有指针,则会出现三种问题。
1.对象在使用默认的赋值函数的时候,前者赋给后者,使用位拷贝,前者原有内存无法释放,导致内存泄漏。
2.使用位拷贝,会导致指针指向同一个地方,改变其中一个值必将影响另一个值。
3.类释放的时候,会调用多次调用析构,两次释放同一个地址的指针会产生内存问题。

拷贝构造使用场景

一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化

默认拷贝构造函数是浅拷贝?

在这里插入图片描述

默认赋值函数是浅拷贝?

在这里插入图片描述

使用默认拷贝构造函数/默认赋值函数的后果?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决方案:深拷贝

在对含有指针成员的对象进行拷贝时,可以采用自定义拷贝构造函数。
在这里插入图片描述
在对含有指针成员的对象进行拷贝时,还可以采用自定义赋值函数。
在这里插入图片描述

解决方案:智能指针

在对含有指针成员的对象进行拷贝时,还可以将指针成员定义成智能指针 std::shared_ptr,其内部含有引用计数,因此也不会产生多次释放问题。


版权声明:本文为qq_36651243原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。