【C++】构造函数和析构函数第四部分(深拷贝和浅拷贝)--- 2023.11.25
目录
- 什么是浅拷贝?
- 浅拷贝的问题
- 使用深拷贝解决浅拷贝问题
- 结束语
什么是浅拷贝?
如果在一个类中没有人为定义拷贝函数,则系统会提供默认拷贝函数。那么在此默认拷贝函数中主要进行了简单的赋值操作,那这个简单的赋值操作我们一般叫做浅拷贝。
浅拷贝的问题
浅拷贝具体有什么问题,我们先看一个示例,如下所示:
class Student
{
public:Student(const char *name, int Age){pName = (char*)malloc(strlen(name) + 1);strcpy(pName, name);age = Age;}~Student(){cout << "析构函数" <<endl;if (pName != NULL){free(pName);pName = NULL;}}
public:char *pName;int age;
};void test02()
{Student s1("小花", 18);Student s2(s1);cout << "s1 Name=" << s1.pName << " s1 age=" << s1.age << endl;cout << "s2 Name=" << s2.pName << " s2 age=" << s2.age << endl;
}
代码运行结果如下:

如上图所示,代码并不能正常运行,我们接下来分析原因。
Student s1("小花", 18);
首先我们先实例化对象,并且该对象名为s1,在实例化对象过程中会进行如下几步:
- 申请一块内存空间用来存放公有变量pName和age。
- 调用构造函数,在堆中申请一块内存空间,将指针name所指向的内容赋值给刚刚在堆中申请的内存空间,则该空间内容为“小花”
- 将Age赋值给age。
最终如下所示:

Student s2(s1);
当执行这条语句时,会调用拷贝构造函数,但是我们在类中并没有设定拷贝构造,故会调用系统默认的拷贝构造函数,即浅拷贝。即s2.pName = s1.pName,s2.age = s1.age。如下图所示:

此时当执行完test02函数时,会调用s1的析构函数和s2的析构函数。我们接下来分析下:
调用s1的析构函数时,会判断pName指向的空间存不存在,如果存在,即释放掉该空间,并将pName指针指向空。同样的操作,当执行s2的析构函数时,也会判断pName指向的空间存不存在,如果存在,则释放掉该空间,但是此时出现一个问题,pName指向的那块空间在执行s1析构函数时已经释放掉了,即再次释放空间时,会出现错误。这就是浅拷贝的问题,也是上述代码没有正常运行的根本原因(同一块空间被释放两次)。
使用深拷贝解决浅拷贝问题
在之前的示例中因为我们没有人为定义拷贝构造函数,使得自动调用了系统的默认拷贝构造函数,才造成同一块内存空间被同时释放两次的现象。那么为了解决这个问题,我们可以通过自己写拷贝构造函数来解决这个问题。
先上代码:
//深拷贝Student(const Student &stu){cout << "自己的拷贝构造函数" << endl;//1.申请空间pName = (char*)malloc(strlen(stu.pName) + 1);//2.拷贝数据strcpy(pName, stu.pName);age = stu.age;}

运行代码结果如下:

结束语
如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!
相关文章:
【C++】构造函数和析构函数第四部分(深拷贝和浅拷贝)--- 2023.11.25
目录 什么是浅拷贝?浅拷贝的问题使用深拷贝解决浅拷贝问题结束语 什么是浅拷贝? 如果在一个类中没有人为定义拷贝函数,则系统会提供默认拷贝函数。那么在此默认拷贝函数中主要进行了简单的赋值操作,那这个简单的赋值操作我们一般…...
加速软件开发:自动化测试在持续集成中的重要作用!
持续集成的自动化测试 如今互联网软件的开发、测试和发布,已经形成了一套非常标准的流程,最重要的组成部分就是持续集成(Continuous integration,简称CI,目前主要的持续集成系统是Jenkins)。 那么什么是持…...
工具及方法 - 查找排名:国内网络作家排名
中国十大网络小说作家排名,在买购网的排名: 中国十大网络小说作家 网络小说作家排行榜 中国著名网络写手排名→MAIGOO生活榜 (这个网站里还有很多其他的排名。) 1,唐家三少 2,辰东 3,我吃西红…...
MySQL INSERT插入条件判断:如果不存在则插入
MySQL INSERT插入条件判断:如果不存在则插入(转) 我们经常需要进行sql的批量插入,要求:该条记录不存在则插入,存在则不插入。如果使用一条INSERT语句实现呢? ####普通的 INSERT INTO 插入&…...
CSM32RV003:国产高精度16位ADC低功耗RISC-V内核MCU
目录 高精度ADC工业应用工业数据采集应用CSM32RV003简介主要特性 高精度ADC工业应用 高精度ADC即高精度模数转换器,是一种能够将输入模拟信号转换为数字信号的芯片,在多种消费电子、工业、医疗和科研领域都有广泛应用。高精度ADC的主要特点是能够提供高…...
65道常问前端面试题总结react
面试题总结 一.Axios的实现原理 Axios 是一个基于 Promise 的 HTTP 客户端库,用于浏览器和 Node.js 环境。它可以发送 HTTP 请求并处理响应数据。下面是 Axios 实现的基本原理: 封装请求:Axios 提供了一个简单易用的 API,使得开…...
单片机学习1——点亮一个LED灯
Keil软件编写程序: 特殊功能寄存器声明: #include<reg52.h>sbit LED P1^0;void main() {LED 0;while(1); } 代码说明: sbit 语句是特殊功能位声明。 生成HEX文件,这个文件是下载到单片机里的文件。Options for Target…...
PyCharm 配置sqlite3驱动下载问题
单击View -> Tool Windows -> Database,打开Database窗体,之后进行配置,下载驱动包失败! 解决 (1)下载Sqlite3驱动 下载地址: Central Repository: org/xerial/sqlite-jdbc 选择的版本是3.34.0,下载…...
NVMe-oF E-JBOF设计解析:WD RapidFlex网卡、OpenFlex Data24
OpenFlex Data24 NVMe-oF Storage Platform WD的SN840 NVMeSSD新品并没有太吸引我注意,因为它还是PCIe 3.0接口的,要知道Intel的PCIe 4.0 SSD都已经推出了。 但上面这个NVMe-oF(NVMe over Fabric)EBOF(区别于普通JBO…...
visual studio 下的git
我这个是看视频笔记 YouTube : https://www.youtube.com/watch?vgkDASVE_Hdg 主要内容是:建立git 库, 保存commit, 建立分支 create branch, 合并分支merge branch,比较 diff,Revert ,history,delete branch, rename branch, t…...
[架构之路-249]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:如何用图形表达需求,结构化方法的需求分析
目录 一、概述 二、数据模型:E-R图/实体关系图(数据单元之间的结构关系) 三、功能模型:数据流图DFD(逻辑运算,包括输入和输出,实体之间的关系):输入》处理 》 输出 四…...
Django之中间件与CSRF_TOKEN
文章目录 一、什么是中间件二、中间件有什么用三、Django自定义中间件中间件中主要方法及作用创建自定义中间件的步骤:process_request与process_response方法process_view方法process_exceptionprocess_template_response(不常用) 四、CSRF_…...
柑橘病害数据集(四类图像分类,没有打yolo标签)
1.文件夹分为训练集和测试集 在这个数据集中,有一类是新鲜柑橘,还有另外三种疾病,溃疡病、黑斑病和绿化病。 2.train文件夹 2.1.blackspot(黑斑病) 文件夹 206张照片 2.2.canker(溃疡病) 文…...
面向对象三大特性:封装,继承,多态;多态的机制;以及多态是如何实现的,实现的必要条件
文章目录 面向对象三大特性2.1.1 封装 继承 多态2.1.2 其中Java 面向对象编程三大特性:封装 继承 多态2.1.3 关于继承如下 3 点请记住:2.1.4 什么是多态机制?Java语言是如何实现多态的?2.1.5 Java实现多态有三个必要条件ÿ…...
Unity-类-Vector
Vector矢量 是一个基本的数学概念,它允许你描述方向和大小。在游戏和应用中,矢量通常用于描述一些基本属性,如角色的位置、物体移动的速度或两个物体之间的距离。 矢量算术是计算机编程很多方面(如图形、物理和动画)的基础,深入了解这一主题对于充分发挥 Unity 的功能很有…...
【腾讯云云上实验室】向量数据库相亲社交应用实践
快速入口 👉向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com) 文章目录 前言1. 向量数据库概念及原理1.1 向量数据库概念1.2 向量数据库核心原理1.3 向量数据库优缺点1.4 向量数据库与传统数据库的区别 2. 腾讯云向量数据库的基本特性及优…...
SpringCloud Netflix 知识点汇总
目录 SpringCloud概念:1、什么是springcloud?2、SpringCloud有哪些核心组件?3、什么是分布式?4、什么是微服务?5、分布式+微服务+集群6、微服务之间是如何独立通讯的Eureka1、什么是Eureka ?2、为什么使用Eureka?3、什么是Eureka自我保护机制4、Zookeeper 和 Eureka 区别…...
IO口电压下降那么多是怎么回事??
前几天一个工程师向我反馈他测得如下电路MCU IO口的电压不是3.3V,只有2V多。 IO配置的是输入功能,无上下拉。最初我不太相信这个结果,后来自己用万用表实际测量了下,还真是这个结果 这是咋回事呢?不应该电压就是3.3V吗…...
NLP实践——LLM生成过程中防止重复循环
NLP实践——LLM生成过程中防止重复 1. 准备工作2. 问题分析3. 创建processor3.1 防止重复生成的processor3.2 防止数字无规则循环的processor 4. 使用 本文介绍如何使用LogitsProcessor避免大模型在生成过程中出现重复的问题。 1. 准备工作 首先实例化一个大模型,…...
用苹果签名免费获取Xcode
使用苹果企业签名免费获取Xcode: 打开Xcode。连接iOS设备到Mac。选择Window→Devices and Simulators。选择该设备。将IPA文件拖到“Installed Apps”的列表框中即可安装。使用Cydia Impactor(可以在网上找到相关下载链接): 打开…...
Ubuntu服务器优化:手动编译ixgbe驱动提升10G网卡性能(附RSS多队列配置)
Ubuntu服务器网络性能深度调优:手动编译ixgbe驱动与RSS多队列实战指南 当你的Ubuntu服务器需要处理每秒数十万级网络请求时,默认的ixgbe驱动可能成为性能瓶颈。上周我们的视频转码集群就遇到了这样的问题——在10G网络环境下,系统日志频繁出现…...
颠覆传统认知!Science新研究|学习让大脑神经元更“合群”,而非更“独立”
当你在某项技能上愈发熟练,比如在人群中一眼认出熟悉的面孔、快速发现文字里的拼写错误,或是精准预测游戏中的下一步动作时,大脑中的感觉神经元并不会变得更独立地工作,反而会变得愈发协调,彼此共享信息、协同行动。这…...
国风美学生成模型v1.0在嵌入式设备上的部署探索与性能分析
国风美学生成模型v1.0在嵌入式设备上的部署探索与性能分析 最近,一个挺有意思的想法在我脑子里转悠:那些能生成精美国风画作的AI模型,能不能塞进一个小小的嵌入式设备里,让它随时随地都能创作?比如,一个智…...
JD_AutoComment图片审核难题:从系统瓶颈到企业级解决方案的架构演进
JD_AutoComment图片审核难题:从系统瓶颈到企业级解决方案的架构演进 【免费下载链接】jd_AutoComment 自动评价,仅供交流学习之用 项目地址: https://gitcode.com/gh_mirrors/jd/jd_AutoComment 京东自动评价系统JD_AutoComment在实现自动化评论功能时&#…...
迎接范式革命:最新、最全的大模型Latent Space综述,NUS、复旦、清华等联合出品
从 2024 年底的关于潜在空间的早期探索,再到 2025 年底和 2026 年初的相关研究爆发,潜空间范式正在彻底重塑大模型 (LLMs, VLMs, VLAs 等延伸模型) 的底层设计逻辑。当大部分大模型还在依靠显式空间 (Explicit Space) 或者说语言空间 (Verbal Space) 完成…...
Legacy-iOS-Kit终极指南:iOS设备降级、越狱与系统恢复完整解决方案
Legacy-iOS-Kit终极指南:iOS设备降级、越狱与系统恢复完整解决方案 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-i…...
SAP MM DIEN类型服务料号的采购
SAP MM DIEN类型服务料号的采购Part I - 前言SAP S/4HANA系统中,对于服务物料,有两种物料类型,SERV和DIEN。它们的用途不同,功能也各不相同。DIEN 物料类型DIEN 是用于向客户提供服务的物料类型。它通常用于销售订单中,…...
网络协议:BFD
文章目录 BFD RFC 7419 开源软件 omni switch vpp keepalived openswitch BFD 自从我接手一个网络项目,从2018年开始做BFD,一直到2026年,还没有完成,现在看项目计划BFD的开发都要拖到2028年了。一个主要的原因是需求没有这么强烈,原来的网络检测方法以及够用,满足需求。…...
从STM32 HAL库转战逐飞TC264:GPIO配置的5个关键差异与实战避坑指南
从STM32 HAL库转战逐飞TC264:GPIO配置的5个关键差异与实战避坑指南 如果你已经习惯了STM32 HAL库的开发方式,初次接触逐飞TC264的GPIO配置可能会感到既熟悉又陌生。就像从自动挡汽车换到手动挡,虽然都是驾驶,但操作逻辑和细节处理…...
mysql如何实现高可用集群架构_基于MHA环境搭建与部署
MHA主从切换失败报SSH连接失败,实为默认用root远程登录被禁,需手动测试ssh免密登录、显式配置ssh_user、检查密钥权限及relay_log_recovery等。MySQL 主从切换失败时 MHA 报错 SSH connection failed 怎么查不是网络不通,而是 MHA 默认用 roo…...
