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
#include <iostream>
using namespace std;

class Person
{
public:
Person(int a,int Age)
{
age = Age
num = new int(a);//将空间开辟在堆区,需要人为释放
}
Person()
{
cout <<"默认无参"<<endl;
}
Person(const Person &p)
{
this->num = p.num;
cout<<"浅拷贝" <<endl;
}
~Person()
{
if(num!=NULL)//判断申请的空间是否释放
{
delete num;
num = NULL;
}
cout <<"析构函数"<<endl;
}

int age
int *num;
};
int main()
{
Person p1(10,66);
Person p2(p1);
cout << *p1.num<<endl;
cout << *p2.num<<endl;

}

运行结果:程序崩溃(CLion)

image-20220210215904174

存在的问题和解决方法

image-20220210221905205

深拷贝

  • 在堆区重新申请空间,进行拷贝操作

<先进后出,所以拷贝的先被释放>

示例:

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
46
47
48
49
50
51
52
53
54
55
56
class Person {
public:
//无参(默认)构造函数
Person() {
cout << "无参构造函数!" << endl;
}
//有参构造函数
Person(int age ,int height) {

cout << "有参构造函数!" << endl;

m_age = age;
m_height = new int(height);

}
//拷贝构造函数
Person(const Person& p) {
cout << "拷贝构造函数!" << endl;
//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
m_age = p.m_age;
m_height = new int(*p.m_height);

}

//析构函数
~Person() {
cout << "析构函数!" << endl;
if (m_height != NULL)
{
delete m_height;
}
}
public:
int m_age;
int* m_height;
};

void test01()
{
Person p1(18, 180);

Person p2(p1);

cout << *p1.m_height << endl;

cout << *p2.m_height << endl;
}

int main() {

test01();

system("pause");

return 0;
}

总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题