3-1深拷贝与浅拷贝
1.浅拷贝
class Array{
public:
Array(){
m_iCount = 5;
}
Array(const Array& arr){ // 拷贝构造函数
m_iCount = arr.m_iCount;
}
private:
int m_iCount;
}
int main(){
Array arr1;
Array arr2 = arr1; // 浅拷贝
return 0;
}
另一个例子:
class Array{
public:
Array(){
m_iCount = 5;
}
Array(const Array& arr){ // 拷贝构造函数
m_iCount = arr.m_iCount;
m_pArr = arr.m_pArr;
}
private:
int m_iCount;
int *m_pArr;
}
int main(){
Array arr1;
Array arr2 = arr1; // 有问题的浅拷贝
return 0;
}
问题所在:
![](https://img.haomeiwen.com/i3736230/a5647b44b343cb28.png)
两个对象arr1和arr2的各自的成员m_pArr都指向了同一内存,arr2的成员m_pArr的赋值操作将会覆盖掉arr1的成员m_pArr。最严重的是当arr1和arr2对象先后被销毁时,二者的成员m_pArr所指向的内存将会被释放两次!这将引起程序的崩溃。
2.我们所想要的是这样子的:
![](https://img.haomeiwen.com/i3736230/6910da2f1c62cb43.png)
如何做呢?
深拷贝:
![](https://img.haomeiwen.com/i3736230/b0a9e21b40d3a4e8.png)
使用数组,将每个元素都一一赋值。
网友评论