C++浅拷贝和深拷贝
深拷贝和浅拷贝可以简答理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
浅拷贝:
在对象复制时,只是对对象中的数据成员进行简单的赋值。
大多情况下浅拷贝已经能很好地工作了,但是如果要复制的数据除了属性值本身外,还有附加在属性值上的额外内容,那么浅拷贝就会出问题了。
例如,在某些情况下,类内成员变量需要通过new动态开辟内存空间,如果把对象里的值完全复制给另一个对象,即A=B。这时,假如B中有一个成员变量指针已经申请了内存,则A中的那个成员变量也指向了同一块内存。这时,就出现了问题:当B把内存释放了(如析构),A内的指针就是野指针了,出现运行错误。
在浅拷贝时,只是将成员的值进行赋值,也即将两个指针指向了同一个空间。在销毁对象时,两个对象的析构函数将对同一个内存空间释放两次,这就是错误出现的原因。程序需要的不是两个p有相同的值,而是两个p指向的空间有相同的值,解决办法就是使用“深拷贝”。
深拷贝:
在深拷贝的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间。
在完成对象的复制后,两个指针各自指向不同的内存空间,但它们指向的空间具有相同的内容,这就是深拷贝。