C++中深拷贝与浅拷贝

news2024/11/13 10:04:48

描述:

在未定义显示拷贝构造函数的情况下,系统调用默认的拷贝函数——即浅拷贝,它能够完成成员的简单赋值拷贝操作。当数据成员中没有指针时,浅拷贝是可行的;

但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,执行两次清理,对同一块动态内存执行2次以上释放的结果是未定义的,所以这将导致内存泄露或程序崩溃。所以,此时,必须采用深拷贝。

定义:

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

一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。

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

示例:

设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如下

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的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;

	cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

总结:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ vectorOJ练习题

目录 136. 只出现一次的数字 118. 杨辉三角 26. 删除有序数组中的重复项 137. 只出现一次的数字ll 260. 只出现一次的数字 III 17. 电话号码的字母组合 JZ39 数组中出现次数超过一半的数字 136. 只出现一次的数字 采用异或运算的思路 异或运算的特性是&#xff0c;相同的…

多机编队—(1)ubuntu 配置Fast_Planner

文章目录 前言一、Could not find package ...二、使用error: no match for ‘operator’...总结 前言 最近想要做有轨迹引导的多机器人编队&#xff0c;打算采用分布式的编队架构&#xff0c;实时的给每个机器人规划出目标位置&#xff0c;然后通过Fast_Planner生成避障路径&…

【与C++的邂逅】--- string容器使用

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客我们将来了解string容器本身以及接口的使用。 string是串&#xff0c;本质是一个字符数组&#xff0c;可以对其进行增删查改。 &am…

Camtasia2024破解版本电脑屏幕录像编辑神器全新体验

&#x1f31f; 屏幕录像与编辑神器——Camtasia2024全新体验 大家好&#xff01;今天我要来和大家安利一款让我彻底摆脱视频制作烦恼的神器——Camtasia2024&#xff01;&#x1f389; &#x1f308; 功能升级&#xff1a;更智能&#xff0c;更便捷 得提的是Camtasia 2024在功…

python的常用模块,必能覆盖你的需求

1.Request 把python的提示信息做到精细且覆盖广泛 2.Numpy 非常重要的库&#xff0c;最初学Python&#xff0c;第一个使用的就是这个。为Python提供了很多高级的数学方式 3.SciPy 是Python的算法和数学工具车&#xff0c;把很多科学家从RUby吸引到了python 4. P…

【车载开发系列】ParaSoft安装步骤介绍

【车载开发系列】ParaSoft安装步骤介绍 【车载开发系列】ParaSoft安装步骤介绍 【车载开发系列】ParaSoft安装步骤介绍一. 前言二. 安装步骤1. 双击安装包2. 选择安装语言3. 选择许可协议4. 选择软件安装位置5. 选择开始菜单文件夹6. 选择安装时的附加任务7. 安装准备完毕8. 执…

【小沐学OpenGL】Ubuntu环境下glfw的安装和使用

文章目录 1、简介1.1 OpenGL简介1.2 glfw简介 2、安装glfw2.1 直接命令二进制安装2.2 源码安装 3、测试glfw3.1 测试1&#xff0c;glfwglew3.2 测试2&#xff0c;glfwglad3.3 测试3 结语 1、简介 1.1 OpenGL简介 OpenGL作为图形界的工业标准&#xff0c;其仅仅定义了一组2D和…

PhotoZoom9怎么样?图片模糊怎么办?

DeepZoomPix的前身。PhotoZoom是一款新颖的、技术上具有革命性的对数码图片进行放大的工具。通常的工具对数码图片进行放大时&#xff0c;总会降低图片的品质&#xff0c;而这款软件使用了S-SPLINE Max技术 一种申请过专利的&#xff0c;拥有自动调节、高级的插值算法的技术&am…

PCIe总线-Linux内核PCIe设备枚举流程分析(十三)

1.简介 当系统启动时或者有新的PCIe设备接入时&#xff0c;PCIe主机会扫描PCIe总线上的PCIe设备&#xff0c;读取设备配置空间信息&#xff0c;建立设备的拓扑关系&#xff0c;然后为设备分配资源&#xff08;如内存空间、I/O空间、中断、总线编号等&#xff09;&#xff0c;最…

网络安全AI大模型训练从入门到精通

前言 2022年下半年&#xff0c;国内安全圈内开始完chatGPT&#xff0c;当时在安全圈内小火了一把。大家纷纷注册去体验一把&#xff0c;希望chatGPT能帮助解决日常安服渗透问题。当时以为仅此而已&#xff0c;谁知年后大火&#xff0c;随后以chatGPT为代表的大语言模型&#x…

【老课推荐】基于LangChain和知识图谱的大模型医疗问答机器人项目

在当今数据驱动和人工智能主导的时代&#xff0c;大模型和知识图谱的结合是一个重要的研究和应用方向。大模型实战课程通过48课时&#xff0c;分为六个主要章节&#xff0c;涵盖了从基本概念到高级应用的多方面内容。学员将通过本课程学习如何使用LangChain和OpenAI进行开发&am…

Spring Boot:医疗排班系统开发的技术革新

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

数据分析:Python语言相关性对角矩阵计算

文章目录 介绍加载R包导入数据计算连续型变量相关系数展示显著性结果图总结介绍 下三角相关系数矩阵是指相关系数矩阵中,仅展示主对角线以下部分(不包括主对角线)的值。在相关系数矩阵中,主对角线上的元素都是1(因为任何变量与自身的相关系数都是完美的1),而上三角和下…

Java笔试面试题AI答之单元测试JUnit(2)

文章目录 7. 为什么JUnit只报告单次测试中的第一次失败&#xff1f;8. Java中&#xff0c;assert是一个关键字。 这不会与JUnit的assert&#xff08;&#xff09;方法冲突吗&#xff1f;9. 解释如何测试静态方法&#xff1f;一、直接调用测试二、隔离依赖三、使用Mock框架四、重…

助贷行业的三大严峻挑战:贷款中介公司转型债务重组业务

大家是否察觉到一种趋势&#xff1f;现如今&#xff0c;众多贷款辅助服务机构与专注于债务再构的公司之间形成了紧密的“联动”。有的选择将获取的贷款需求转介给债务重组方&#xff0c;有的则直接下场&#xff0c;动用自身资本参与债务重组业务。这一现象背后&#xff0c;究竟…

每日一练:合并区间

一、题目要求 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;in…

四.海量数据实时分析-Doris数据导入导出

数据导入 1.概述 Apache Doris 提供多种数据导入方案&#xff0c;可以针对不同的数据源进行选择不同的数据导入方式。 数据源导入方式对象存储&#xff08;s3&#xff09;,HDFS使用 Broker 导入数据本地文件Stream Load, MySQL LoadKafka订阅 Kafka 数据Mysql、PostgreSQL&a…

表格多列情况下,loading不显示问题

问题描述&#xff1a; 用element plus 做得表格&#xff0c;如下图&#xff0c;列数较多&#xff0c;且部分表格内容显示比较复杂&#xff0c;数据量中等的情况下&#xff0c;有一个switch 按钮&#xff0c;切换部分列的显示和隐藏&#xff0c;会发现&#xff0c;切换为显示的时…

单线程 TCP/IP 服务器和客户端的实现

单线程 TCP/IP 服务器和客户端的实现 文章目录 单线程 TCP/IP 服务器和客户端的实现通信流程服务端客户端 代码实现服务端客户端 运行结果 通信流程 服务端 socket&#xff1a;创建监听的文件描述符(socket) fd&#xff1b;bind&#xff1a;fd 和自身的 ip 和端口绑定&#x…

【Transformer】Positional Encoding

文章目录 为什么需要位置编码&#xff1f;预备知识三角函数求和公式旋转矩阵逆时针旋转顺时针旋转 原始Transformer中的位置编码论文中的介绍具体计算过程为什么是线性变换&#xff1f; 大模型常用的旋转位置编码RoPE基本原理Llama3中的代码实现 参考资料 为什么需要位置编码&a…