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 }
总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
分类:
C++学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术