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;
}
問題所在:
淺拷貝.png
? 兩個對象arr1和arr2的各自的成員m_pArr都指向了同一內存,arr2的成員m_pArr的賦值操作將會覆蓋掉arr1的成員m_pArr。最嚴重的是當arr1和arr2對象先后被銷毀時,二者的成員m_pArr所指向的內存將會被釋放兩次!這將引起程序的崩潰。
2.我們所想要的是這樣子的:
我們想要的拷貝構造函數.png
如何做呢?
深拷貝:
深拷貝.png
? 使用數組,將每個元素都一一賦值。