深拷贝与浅拷贝

Posted 邓涛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。

深拷贝与浅拷贝

关于这两个概念先来看一个例子:

         

在这个例子中,数据成员是一个int类型的数据m_iCount,它的拷贝构造函数的实现很简单,

当使用右边所示的方法实例化arr2时就会调用拷贝构造函数,也就是直接进行数值的拷贝即可。

将这个例子进行一下修改:

在这个例子当中,增加了一个int *类型的指针数据成员,在构造函数中使用new分配了一段内存,

然后使用指针指向这段内存空间;而拷贝构造函数还是进行简单的赋值拷贝操作,通过上面的方

法来实例化arr2这将会导致两个对象中的指针指向同一段内存空间,也就是实例化arr1时分配的

内存空间,这将会造成非常危险的后果,例如两个对象操作这段内存,两个对象在销毁的时候都

去释放这段内存。

我们将上面的拷贝模式叫做浅拷贝,它只是进行了简单的数值拷贝。

那么我们需要将Array类的拷贝构造函数进行一些修改,使之变成深拷贝,如下所示:

在深拷贝函数中,不再是直接进行数值拷贝,而是再次申请一段新的内存,然后将内存中的数据拷贝过去。

总结:当进行对象拷贝时,不是简单的做数值拷贝,而是将堆内存中的数据也进行拷贝,这种拷贝模式就

叫做深拷贝。

 

以上是关于深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

深拷贝与浅拷贝的实现(一)

JavaScript深拷贝与浅拷贝

深拷贝与浅拷贝

深拷贝与浅拷贝详解

面试深拷贝与浅拷贝的实现原理

深拷贝与浅拷贝的区别,实现深拷贝的几种方法