首页 > 代码库 > 深拷贝与浅拷贝

深拷贝与浅拷贝

深拷贝与浅拷贝

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

技术分享         技术分享

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

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

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

技术分享

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

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

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

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

去释放这段内存。

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

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

技术分享

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

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

叫做深拷贝。

 

深拷贝与浅拷贝