定义
浅拷贝:只发生了值本身拷贝,指针指向的还是同一个地址,没有产生资源拷贝。
深拷贝:不仅发生指针本身拷贝,还产生了新的资源分配,指针指向不同地址。
为什么要区分深拷贝和浅拷贝
c++primer中曾提到,如果不主动写拷贝构造函数和赋值函数,这两函数会被编译器以位拷贝(浅拷贝)的方式自动生产缺省参数,假如类中含有指针,则会出现三种问题。
1.对象在使用默认的赋值函数的时候,前者赋给后者,使用位拷贝,前者原有内存无法释放,导致内存泄漏。
2.使用位拷贝,会导致指针指向同一个地方,改变其中一个值必将影响另一个值。
3.类释放的时候,会调用多次调用析构,两次释放同一个地址的指针会产生内存问题。
拷贝构造使用场景
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化
默认拷贝构造函数是浅拷贝?

默认赋值函数是浅拷贝?

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



解决方案:深拷贝
在对含有指针成员的对象进行拷贝时,可以采用自定义拷贝构造函数。
在对含有指针成员的对象进行拷贝时,还可以采用自定义赋值函数。
解决方案:智能指针
在对含有指针成员的对象进行拷贝时,还可以将指针成员定义成智能指针 std::shared_ptr,其内部含有引用计数,因此也不会产生多次释放问题。
版权声明:本文为qq_36651243原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。