浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
浅拷贝和深拷贝的问题出现的条件:
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 }
总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
标签:堆区,申请,C++,中深,拷贝,include,构造函数 From: https://www.cnblogs.com/henabo/p/16705746.html