【C/C++语言系列】浅拷贝和深拷贝

news/2024/9/24 22:47:15/

浅拷贝和深拷贝在面试中经常被问,十分重要。
浅拷贝问题:如果有数据创建在堆区,那么在析构时会出现重复析构的问题。
解决方法:使用深拷贝去解决堆区数据重复释放的问题
观察下面代码,发现浅拷贝问题:

class Person {
public://无参(默认)构造函数Person() {cout << "无参构造函数!" << endl;}//有参构造函数Person(int age ,int height) {cout << "有参构造函数!" << endl;m_age = age;m_height = new int(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的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}int main() {test01();system("pause");return 0;
}

如果不写拷贝构造函数,编译器会自动生成一个浅拷贝的拷贝构造函数:

	//系统自动加的拷贝构造函数  Person(const Person& p) {cout << "拷贝构造函数!" << endl;//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题m_age = p.m_age;m_height = p.m_height	  //浅拷贝,两个指针指向相同}

浅拷贝报错原因:这样两个m_height指针指向同一块内存,它们各自都调用析构函数就会造成堆区数据重复释放。

解决方法深拷贝:重新在堆区创建一块内存,它们的指向不同,单指向的内容相同,这样在析构时分别释放自己的堆区数据。

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

http://www.ppmy.cn/news/1529997.html

相关文章

python 实现collatz sequence考拉兹序列算法

collatz sequence考拉兹序列算法介绍 考拉兹序列&#xff08;Collatz sequence&#xff09;&#xff0c;也被称为3n1序列或奇偶归一猜想&#xff08;3x1 problem&#xff09;&#xff0c;是一个数学中的未解问题&#xff0c;由德国数学家Lothar Collatz在1937年提出。 考拉兹…

9.20-使用k8s部署wordpress项目

部署wordpress项目 部署mariadb # 启动docker进程systemctl start docker​# 拉取三个镜像​docker pull nginx:alpinedocker pull wordpress:latestdocker pull mariadb:latest​# 保存三个镜像​cddocker save -o wordpress.tar wordpress:latestdocker save -o mariadb.tar…

【数据结构初阶】链式二叉树接口实现超详解

文章目录 1. 节点定义2. 前中后序遍历2. 1 遍历规则2. 2 遍历实现2. 3 结点个数2. 3. 1 二叉树节点个数2. 3. 2 二叉树叶子节点个数2. 3. 3 二叉树第k层节点个数 2. 4 二叉树查找值为x的节点2. 5 二叉树层序遍历2. 6 判断二叉树是否是完全二叉树 3. 二叉树性质 1. 节点定义 用…

virtualbox中的网络模式,网络设置,固定IP

virtualbox关于网络设置的文档&#xff1a;https://www.virtualbox.org/manual/topics/networkingdetails.html#networkingdetails DHCP Dynamic Host Configuration Protocol&#xff1a;动态主机配置协议&#xff0c;是专门用来给网络中的节点分发IP地址&#xff0c;确保每…

【个人博客hexo版】hexo安装时会出现的一些问题

项目场景&#xff1a; 项目场景&#xff1a;在完成了GitHub仓库和git的连接之后&#xff0c;就要新建一个文件夹&#xff08;例如hexo blog&#xff09;进行下一步hexo的使用 问题描述 例如&#xff1a;如图所示 原因分析&#xff1a; 这些error不用看它到底是什么&#xf…

二.Oracle每周运维操作

目录 2.1、监控数据库对象的空间扩展情况 2.2、监控数据量的增长情况 2.3、系统健康检查 2.4、 检查无效的数据库对象 2.5、检查不起作用的约束 2.6、检查无效的trigger 2.7 数据库补丁更新 解释&#xff1a; 操作步骤&#xff1a; 2.1、监控数据库对象的空间扩展情况 …

C语言中的typedef简介

type简介 在C语言中&#xff0c;typedef 是用于为现有的数据类型定义一个新的类型名称的关键字。它的作用是为类型取一个别名&#xff0c;使代码更简洁、更易于理解。 基本语法 typedef 原始类型 新类型名; 示例 为 int 类型定义一个别名&#xff1a; typedef int INTEGER…

【VUE3.0】动手做一套像素风的前端UI组件库---Button

目录 引言做之前先仔细看看UI设计稿解读一下都有哪些元素&#xff1a;素材补充 代码编写1. 按钮四周边框2. 默认状态下按钮颜色立体效果3. 鼠标移入聚焦4. 模拟鼠标点击效果 组件封装1. 按类型设置颜色2. 设置按钮禁用状态3. 处理一个bug4. 看下整体组件效果5. 组件完整代码6. …