0%

浅拷贝与深拷贝

浅拷贝

  • 简单的拷贝对象成员变量的值,而不拷贝对象所指向的动态分配的内存。
  • 新旧对象的指针成员指向相同内存地址的指针,共享同一块内存。
  • 如果其中一个对象销毁了这个指针指向的内存,另一个对象可能会引用已经无效的内存地址。
  • 当一个对象发生改变时,由于另一个对象与之共享同一块内存,另一个对象也会受到影响。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;

class ShallowCopy {
private:
int *data;

public:
ShallowCopy(int val) {
data = new int(val);
}

ShallowCopy(const ShallowCopy &other) {
data = other.data; // 进行浅拷贝
cout<<"shallow copy"<<endl;
}

int getData() const {
return *data;
}

void setData(int val) {
*data = val;
}

~ShallowCopy() {
delete data;
}
};

int main() {
ShallowCopy a1(5);
ShallowCopy a2 = a1;

cout << "a1=" << a1.getData() <<" "
<< "a2=" << a2.getData() << endl;

a1.setData(10);

cout << "a1=" << a1.getData() <<" "
<< "a2=" << a2.getData() << endl;

return 0;
}

输出结果:

1
2
3
shallow copy
a1=5 a2=5
a1=10 a2=10

深拷贝

  • 不仅拷贝对象本身,还拷贝对象所指向的动态分配的内存,以确保拷贝后的对象和原对象指向的内存是独立的。
  • 深拷贝会为新的对象分配一块新的内存,并将原对象所指向的内存的内容复制到新分配的内存中,从而使得新旧对象完全独立,互不影响。
  • 即使两个对象有相同的值,它们也各自拥有一份独立的内存副本,彼此互不影响。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;

class DeepCopy {
private:
int *data;

public:
DeepCopy(int val) {
data = new int(val);
}

DeepCopy(const DeepCopy &other) {
data = new int;
*data = *(other.data); // 进行深拷贝
cout<<"deep copy"<<endl;
}

int getData() const {
return *data;
}

void setData(int val) {
*data = val;
}

~DeepCopy() {
delete data;
}
};

int main() {
DeepCopy b1(5);
DeepCopy b2(b1);

cout << "b1=" << b1.getData() <<" "
<< "b2=" << b2.getData() << endl;

b1.setData(10);

cout << "b1=" << b1.getData() <<" "
<< "b2=" << b2.getData() << endl;

return 0;
}

输出结果:

1
2
3
deep copy
b1=5 b2=5
b1=10 b2=5