简述 C++深拷贝和浅拷贝

以下为个人的理解:

深拷贝和浅拷贝主要是针对指针而言,例如两个指针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

原文地址:https://www.cnblogs.com/drperry/p/14512365.html