以下为个人的理解:
深拷贝和浅拷贝主要是针对指针而言,例如两个指针a和b,令b=a,则此时就是浅拷贝,即只是把指针a的值(32位地址)赋值给了指针b,此时a和b的值相同,它们所指向的是同一块地址,对该地址中的数据的修改会同时影响到a和b。同样的,对a和b中任何一个指针进行释放(delete/free),都会导致另外一个指针指向无效的地址(成为野指针,使用野指针会导致未定义行为)。
如果想进行深拷贝,则需要使a和b两个指针的值(32位地址)不同,但2个地址中的数据值相同,可以采用先为b分配空间,再赋值的方法。
一个简单的浅拷贝的例子:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int * a = new int; 6 *a = 1; 7 int *b = a;//浅拷贝 8 cout << a << endl << b << endl;//可见指针a和b的值是相同的 9 cout << *a << endl << *b << endl;//a和b指向的数据值也相同 10 delete a;//释放a,此时b成为野指针 11 cout << *b;//未定义行为 12 }
以上代码输出为:
0x11a18b0
0x11a18b0
1
1
18510576
简单的深拷贝的例子:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int * a = new int; 6 *a = 1; 7 int *b = new int; 8 *b = *a;//深拷贝 9 cout << a << endl << b << endl;//a和b的值不同 10 cout << *a << endl << *b << endl;//a和b指向的数据值相同 11 delete a;//释放a,对b无影响 12 cout<< *b <<endl; 13 }
以上代码输出为:
0x10118b0
0x10118c0
1
1
1