C++中深拷贝和浅拷贝

浅拷贝:简单的赋值拷贝操作

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

 

浅拷贝和深拷贝的问题出现的条件:

1、拷贝构造函数

2、用new关键字在堆区申请空间

 

在拷贝构造函数当中,如果构造函数使用的是new关键字申请堆区空间,这个时候就需要十分注意!!

不能简单的赋值操作浅拷贝,否则两个对象的指针会指向堆区同一块内存区域,会出现堆区内存重复释放的问题。

因此需要进行深拷贝,即在堆区重新申请空间,进行拷贝操作

 

示例:

 1 #include <string>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 class Person {
 7 public:
 8     //无参(默认)构造函数
 9     Person() {
10         cout << "无参构造函数!" << endl;
11     }
12     //有参构造函数
13     Person(int age ,int height) {
14 
15         cout << "有参构造函数!" << endl;
16 
17         m_age = age;
18         m_height = new int(height);
19 
20     }
21     //拷贝构造函数
22     Person(const Person& p) {
23         cout << "拷贝构造函数!" << endl;
24         //如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
25         m_age = p.m_age;
26 //        m_height = new int(*p.m_height);
27         m_height = p.m_height;
28     }
29 
30     //析构函数
31     ~Person() {
32         cout << "析构函数!" << endl;
33         if (m_height != NULL)
34         {
35             delete m_height;
36         }
37 //        delete m_height;
38     }
39 public:
40     int m_age;
41     int* m_height;
42 };
43 
44 void test01()
45 {
46     Person p1(18, 180);
47 
48     Person p2(p1);
49 
50     cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;
51 
52     cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
53 
54     cout << &p1.m_age << endl;
55     cout << &p2.m_age << endl;
56     // 查看p1.m_height和p2.m_height在堆区的内存地址
57     cout << &(*p1.m_height) << endl;
58     cout << &(*p2.m_height) << endl;
59 }
60 
61 int main() {
62 
63     test01();
64 
65 
66     return 0;
67 }

 

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

posted @ 2022-09-18 20:48  何侠客  阅读(155)  评论(0编辑  收藏  举报