c++中深拷贝和浅拷贝的联系和区别
在 C++ 编程里,深拷贝和浅拷贝是两种不同的对象复制方式,它们在实现方式、资源管理和适用场景等方面存在显著差异。下面为你详细介绍它们的区别。
1. 基本概念
- 浅拷贝:浅拷贝仅仅复制对象的成员变量值。对于基本数据类型(如
int、double等),会直接复制其值;而对于指针类型的成员变量,浅拷贝只是复制指针的值(即内存地址),这就导致多个对象会共享同一块内存空间。 - 深拷贝:深拷贝不仅会复制对象的成员变量值,当遇到指针类型的成员变量时,它会为新对象的指针成员分配一块新的内存空间,并将原对象指针所指向的内存内容复制到新的内存空间中,这样每个对象都拥有自己独立的内存副本。
2. 实现方式
浅拷贝
浅拷贝通常由编译器自动生成的默认拷贝构造函数和赋值运算符重载函数来实现。以下是一个浅拷贝的示例代码:
#include <iostream>class ShallowCopyExample {
public:int* data;ShallowCopyExample(int value) {data = new int(value);}// 默认拷贝构造函数实现浅拷贝ShallowCopyExample(const ShallowCopyExample& other) {data = other.data;}~ShallowCopyExample() {delete data;}
};int main() {ShallowCopyExample obj1(10);ShallowCopyExample obj2(obj1); // 浅拷贝return 0;
}
在这个示例中,obj2 的 data 指针和 obj1 的 data 指针指向同一块内存空间。
深拷贝
深拷贝需要程序员手动编写拷贝构造函数和赋值运算符重载函数来实现。以下是一个深拷贝的示例代码:
#include <iostream>class DeepCopyExample {
public:int* data;DeepCopyExample(int value) {data = new int(value);}// 深拷贝构造函数DeepCopyExample(const DeepCopyExample& other) {data = new int(*other.data);}~DeepCopyExample() {delete data;}
};int main() {DeepCopyExample obj1(10);DeepCopyExample obj2(obj1); // 深拷贝return 0;
}
在这个示例中,obj2 的 data 指针指向一块新的内存空间,该空间存储的是 obj1 中 data 所指向的值的副本。
3. 资源管理
- 浅拷贝:由于多个对象共享同一块内存空间,当其中一个对象释放了这块内存后,其他对象的指针就会变成悬空指针,再次使用这些指针会导致未定义行为。而且,如果多个对象都试图释放同一块内存,会引发内存重复释放的错误。
- 深拷贝:每个对象都有自己独立的内存副本,对象的析构函数可以安全地释放自己的内存,不会影响其他对象,避免了悬空指针和内存重复释放的问题。
4. 性能开销
- 浅拷贝:浅拷贝只复制指针的值,不涉及内存的分配和数据的复制,因此性能开销较小,速度较快。
- 深拷贝:深拷贝需要为指针成员分配新的内存空间,并将数据复制到新的内存中,涉及内存的分配和数据的复制操作,性能开销相对较大,速度较慢。
5. 适用场景
- 浅拷贝:当对象中不包含动态分配的资源(如动态数组、动态对象等),或者对象的生命周期管理比较简单,不需要独立的资源副本时,可以使用浅拷贝。
- 深拷贝:当对象中包含动态分配的资源,并且需要每个对象都有自己独立的资源副本时,必须使用深拷贝,以确保资源的正确管理和避免内存问题。
相关文章:
c++中深拷贝和浅拷贝的联系和区别
在 C 编程里,深拷贝和浅拷贝是两种不同的对象复制方式,它们在实现方式、资源管理和适用场景等方面存在显著差异。下面为你详细介绍它们的区别。 1. 基本概念 浅拷贝:浅拷贝仅仅复制对象的成员变量值。对于基本数据类型(如 int、d…...
Autotestplat 在多个平台和公司推荐使用!
1、 51Testing软件测试网 开源好用!推荐一款更轻量化的自动化测试平台! 2、程序员杨叔 从繁琐到简单!Autotestplat自动化测试平台搭建使用 3、一飞开源 [开源]一站式自动化测试平台及解决方案,支持接口、性能、UI测试 4、github h…...
字符串最后一个单词的长度
一:题目 二:思路 用rfind()函数倒着找第一个空格,返回的值为pos,然后打印size()-(pos1),posnpos就代表只有一个单词,则直接返回size #include <iostream> using namespace std; int main() {strin…...
【Linux】learning notes(3)make、copy、move、remove
文章目录 1、mkdir (make directory)2、rmdir (remove directory)3、rm(remove)4、>5、touch 新建文件6、mv(move)7、cp(copy) 1、mkdir (make…...
一、图像图像的基本概念
文章目录 一、分辨率概念二、图形图像的区别三、位图和矢量图的区别 一、分辨率概念 图形显示计数中的分辨率概念有三种,即屏幕分辨率、显示分辨率和显卡分辨率。它们既有区别又有着密切的联系,对图形显示的处理有极大的影响。 1.屏幕分辨率 显示器分辨…...
两道算法练习
力扣322零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的…...
利用 Python 爬虫进行跨境电商数据采集
1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---(某电商网站爬取)4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代,数据作为核心资源蕴含重要价值,网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…...
设计模式--spring中用到的设计模式
一、单例模式(Singleton Pattern) 定义:确保一个类只有一个实例,并提供全局访问点 Spring中的应用:Spring默认将Bean配置为单例模式 案例: Component public class MySingletonBean {// Spring 默认将其…...
Qt控件中函数指针使用的最终版本,使用std::function
代码: class MyWidget : public QWidget { public:std::function<void(QResizeEvent* event)> pf_resizeEvent 0; protected:inline void resizeEvent(QResizeEvent* event) override {if (pf_resizeEvent ! 0)pf_resizeEvent(event);} };int main(int arg…...
Java中的泛型类 --为集合的学习做准备
学习目标 ● 掌握在集合中正确使用泛型 ● 了解泛型类、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用场景 1.有关泛型 1.1泛型的概念 泛型(Generics)是Java中引入的参数化类型机制,允许在定义类、接口或方法时使用类型参数&a…...
6.6.6 嵌入式SQL
文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是:如何识别嵌入语句?如何让主语言(比如C,C语言)和SQL通信? 识别SQL语句 为了识别主语言中嵌入的SQL…...
基于C#的CANoe CLR Adapter开发指南
一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具,它支持多种编程接口,方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互,充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…...
【Qt】MVC设计模式
目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层,关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…...
【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...
JAVA面试常见题_基础部分_Dubbo面试题(上)
Dubbo 支持哪些协议,每种协议的应用场景,优缺点? • dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化…...
CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–display:none3–visibility: hidden4–opacity: 05–position: absolute;与 left: -9999px;6–z-index 和 position7–clip-path: circle(0%) 2. display:none 标签会挂载在html中,但是不会在页面上…...
二、双指针——5. 移动零
二、双指针——5. 移动零 题目描述示例示例1:示例2: 思路代码 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操…...
论文笔记-NeurIPS2017-DropoutNet
论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet:解决推荐系统中的冷启动问题摘要1.引言2.前言3.方法3.1模型架构3.2冷启动训练3.3推荐 4.实验4.1实验设置4.2在CiteULike上的实验结果4.2.1 Dropout率的影响4.2.2 实验结…...
php 对接mqtt 完整版本,订阅消息,发送消息
首先打开链接如何在 PHP 项目中使用 MQTT 根据文章让所用依赖安装一下: composer require php-mqtt/client 安装之后弄一个部署 之后在工具里边可以相应链接上 接下来是代码: /**** 订阅消息* return void* throws \PhpMqtt\Client\Exceptions\Confi…...
谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他
这是 ES 7.10 相较于 ES 6.8 新增内容的最后一篇,主要涉及算分方法和同义词加载的部分。 自定义算分:script_score 2.0 Elasticsearch 7.0 引入了新一代的函数分数功能,称为 script_score 查询。这一新功能提供了一种更简单、更灵活的方式来…...
2025届最火的五大AI科研方案解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 减低AIGC检测比率的关键之处在于去除机器生成的那种带有规律性的特征,先…...
焕新旧iPhone:用Legacy iOS Kit拯救你的“电子砖头“
焕新旧iPhone:用Legacy iOS Kit拯救你的"电子砖头" 【免费下载链接】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-iOS-Ki…...
5个步骤掌握YimMenu:GTA5全面防护与增强工具实用指南
5个步骤掌握YimMenu:GTA5全面防护与增强工具实用指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMe…...
不止会写脚本,更要会设计系统:从 Python 基础到 Pydantic v2,谈一套真正可靠的工程实践
不止会写脚本,更要会设计系统:从 Python 基础到 Pydantic v2,谈一套真正可靠的工程实践 很多人第一次喜欢上 Python,往往是因为它“好写”。 几行代码就能跑通一个脚本,一个下午就能拼出一个小工具,一周就能…...
STM32F4与W25Q256实战:手把手教你实现SPI Flash数据存储与读取
STM32F4与W25Q256实战:SPI Flash数据存储与读取全解析 在嵌入式系统开发中,外部存储解决方案是不可或缺的一环。无论是物联网设备的日志记录、固件备份,还是用户数据的持久化存储,都需要可靠的非易失性存储介质。W25Q256作为华邦…...
Jimeng LoRA与GitHub工作流集成:自动化AI模型训练
Jimeng LoRA与GitHub工作流集成:自动化AI模型训练 1. 引言 想象一下这样的场景:你刚刚完成了一个Jimeng LoRA模型的训练,效果很不错,但接下来要手动部署到生产环境,还要考虑版本管理和持续更新。这个过程繁琐又容易出…...
OpenClaw自动化报告:Phi-3-mini-128k-instruct数据分析与可视化
OpenClaw自动化报告:Phi-3-mini-128k-instruct数据分析与可视化 1. 为什么需要自动化数据分析 上周我接手了一个紧急任务:需要从300多份客户反馈的CSV文件中提取关键洞察,并制作成PPT向团队汇报。手动操作不仅耗时,还容易遗漏重…...
OpenClaw配置备份指南:百川2-13B-4bits量化版环境迁移技巧
OpenClaw配置备份指南:百川2-13B-4bits量化版环境迁移技巧 1. 为什么需要专门备份OpenClaw配置 上周我的主力开发机突然硬盘故障,导致所有数据丢失。最让我痛心的不是代码仓库——它们都有远程备份,而是那套精心调校的OpenClaw自动化环境。…...
lift off工艺中电子束蒸发镀膜的优势与磁控溅射的局限性对比
1. 电子束蒸发与磁控溅射的基本原理对比 在半导体制造领域,lift off工艺是一种常用的图形化金属层制备方法。简单来说,就是先在晶圆表面涂覆光刻胶并曝光显影形成图案,然后沉积金属薄膜,最后通过化学溶剂剥离光刻胶及附着在其上的…...
【MPU6050】从数据融合到姿态解算:互补滤波实战指南
1. MPU6050传感器基础与姿态解算挑战 第一次接触MPU6050时,我被这个小巧的6轴传感器惊艳到了——它集成了三轴加速度计和三轴陀螺仪,尺寸比指甲盖还小。但真正用它做姿态解算时,问题接踵而至:加速度计输出的数据在动态情况下抖动严…...
