当前位置: 首页 > news >正文

c++中深拷贝和浅拷贝的联系和区别

在 C++ 编程里,深拷贝和浅拷贝是两种不同的对象复制方式,它们在实现方式、资源管理和适用场景等方面存在显著差异。下面为你详细介绍它们的区别。

1. 基本概念

  • 浅拷贝:浅拷贝仅仅复制对象的成员变量值。对于基本数据类型(如 intdouble 等),会直接复制其值;而对于指针类型的成员变量,浅拷贝只是复制指针的值(即内存地址),这就导致多个对象会共享同一块内存空间。
  • 深拷贝:深拷贝不仅会复制对象的成员变量值,当遇到指针类型的成员变量时,它会为新对象的指针成员分配一块新的内存空间,并将原对象指针所指向的内存内容复制到新的内存空间中,这样每个对象都拥有自己独立的内存副本。

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 编程里&#xff0c;深拷贝和浅拷贝是两种不同的对象复制方式&#xff0c;它们在实现方式、资源管理和适用场景等方面存在显著差异。下面为你详细介绍它们的区别。 1. 基本概念 浅拷贝&#xff1a;浅拷贝仅仅复制对象的成员变量值。对于基本数据类型&#xff08;如 int、d…...

Autotestplat 在多个平台和公司推荐使用!

1、 51Testing软件测试网 开源好用&#xff01;推荐一款更轻量化的自动化测试平台&#xff01; 2、程序员杨叔 从繁琐到简单&#xff01;Autotestplat自动化测试平台搭建使用 3、一飞开源 [开源]一站式自动化测试平台及解决方案&#xff0c;支持接口、性能、UI测试 4、github h…...

字符串最后一个单词的长度

一&#xff1a;题目 二&#xff1a;思路 用rfind()函数倒着找第一个空格&#xff0c;返回的值为pos&#xff0c;然后打印size()-(pos1)&#xff0c;posnpos就代表只有一个单词&#xff0c;则直接返回size #include <iostream> using namespace std; int main() {strin…...

【Linux】learning notes(3)make、copy、move、remove

文章目录 1、mkdir &#xff08;make directory&#xff09;2、rmdir &#xff08;remove directory&#xff09;3、rm&#xff08;remove&#xff09;4、>5、touch 新建文件6、mv&#xff08;move&#xff09;7、cp&#xff08;copy&#xff09; 1、mkdir &#xff08;make…...

一、图像图像的基本概念

文章目录 一、分辨率概念二、图形图像的区别三、位图和矢量图的区别 一、分辨率概念 图形显示计数中的分辨率概念有三种&#xff0c;即屏幕分辨率、显示分辨率和显卡分辨率。它们既有区别又有着密切的联系&#xff0c;对图形显示的处理有极大的影响。 1.屏幕分辨率 显示器分辨…...

两道算法练习

力扣322零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的…...

利用 Python 爬虫进行跨境电商数据采集

1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---&#xff08;某电商网站爬取&#xff09;4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代&#xff0c;数据作为核心资源蕴含重要价值&#xff0c;网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…...

设计模式--spring中用到的设计模式

一、单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点 Spring中的应用&#xff1a;Spring默认将Bean配置为单例模式 案例&#xff1a; Component public class MySingletonBean {// Spring 默认将其…...

Qt控件中函数指针使用的最终版本,使用std::function

代码&#xff1a; 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泛型的概念 泛型&#xff08;Generics&#xff09;是Java中引入的参数化类型机制&#xff0c;允许在定义类、接口或方法时使用类型参数&a…...

6.6.6 嵌入式SQL

文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是&#xff1a;如何识别嵌入语句&#xff1f;如何让主语言&#xff08;比如C,C语言&#xff09;和SQL通信&#xff1f; 识别SQL语句 为了识别主语言中嵌入的SQL…...

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…...

【Qt】MVC设计模式

目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层&#xff0c;关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…...

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…...

JAVA面试常见题_基础部分_Dubbo面试题(上)

Dubbo 支持哪些协议&#xff0c;每种协议的应用场景&#xff0c;优缺点&#xff1f; • dubbo&#xff1a; 单一长连接和 NIO 异步通讯&#xff0c;适合大并发小数据量的服务调用&#xff0c;以及消费者远大于提供者。传输协议 TCP&#xff0c;异步&#xff0c;Hessian 序列化…...

CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法

个人博客&#xff1a;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中&#xff0c;但是不会在页面上…...

二、双指针——5. 移动零

二、双指针——5. 移动零 题目描述示例示例1&#xff1a;示例2&#xff1a; 思路代码 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操…...

论文笔记-NeurIPS2017-DropoutNet

论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解决推荐系统中的冷启动问题摘要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 根据文章让所用依赖安装一下&#xff1a; composer require php-mqtt/client 安装之后弄一个部署 之后在工具里边可以相应链接上 接下来是代码&#xff1a; /**** 订阅消息* return void* throws \PhpMqtt\Client\Exceptions\Confi…...

谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他

这是 ES 7.10 相较于 ES 6.8 新增内容的最后一篇&#xff0c;主要涉及算分方法和同义词加载的部分。 自定义算分&#xff1a;script_score 2.0 Elasticsearch 7.0 引入了新一代的函数分数功能&#xff0c;称为 script_score 查询。这一新功能提供了一种更简单、更灵活的方式来…...

【Anaconda】使用指南及问题汇总(自用)

安装 1. Anaconda的下载与安装 除了安装路径修改&#xff0c;其他的一路默认就好 2. Anaconda修改环境变量 因为我们这一步才手动添加环境变量&#xff0c;所以第一步安装的时候不要让它自动配置环境变量了。 用户变量或者系统变量都可以。建议系统变量&#xff0c;方便后…...

别再手动接线了!用ESP-01S转接板5分钟搞定AT固件烧录(附固件下载)

5分钟极简ESP-01S固件烧录指南&#xff1a;转接板避坑全攻略 当你第一次拿到ESP-01S模块时&#xff0c;是否被那密密麻麻的引脚和复杂的接线图吓到&#xff1f;作为物联网开发的入门神器&#xff0c;ESP-01S确实性价比极高&#xff0c;但传统的手动接线烧录方式让不少新手望而…...

高效网络资源捕获工具res-downloader完全指南:从入门到精通

高效网络资源捕获工具res-downloader完全指南&#xff1a;从入门到精通 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否…...

Seraphine:英雄联盟玩家的终极智能助手,5大核心功能一键提升游戏体验

Seraphine&#xff1a;英雄联盟玩家的终极智能助手&#xff0c;5大核心功能一键提升游戏体验 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款专为《英雄联盟》玩家设计的智能游戏辅助工具&…...

Unity ShaderGraph环境搭建:URP配置与节点库激活指南

1. 这不是“装个插件就完事”的 ShaderGraph 入门很多人点开 Unity 官方文档里那句“Shader Graph is included with Unity 2019.1”就直接关掉页面&#xff0c;以为只要打开 Unity 就能拖拽节点写 Shader——结果新建一个 Shader Graph Asset&#xff0c;双击打开&#xff0c;…...

大麦网自动抢票神器:5分钟配置,告别抢票焦虑的终极指南

大麦网自动抢票神器&#xff1a;5分钟配置&#xff0c;告别抢票焦虑的终极指南 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为心仪演唱会门票…...

教师增强器:AI如何真正赋能一线教学而非替代教师

1. 这不是一场技术秀&#xff0c;而是一场教育现场的“静默革命”“AI正在重塑教育”——这句话听上去像极了科技发布会的开场白&#xff0c;但如果你真走进过北京某所公立小学的三年级语文课堂&#xff0c;或者旁听过深圳一所职校的数控编程实训课&#xff0c;你就会发现&…...

Axios内存泄漏:云原生Node.js服务的静默雪崩

1. 这不是漏洞公告&#xff0c;而是一次云原生环境下的“静默雪崩”你有没有遇到过这样的情况&#xff1a;服务在本地跑得好好的&#xff0c;一上Kubernetes就隔三差五OOM&#xff0c;Pod反复重启&#xff0c;监控里内存曲线像心电图一样剧烈波动&#xff0c;但代码里没写大对象…...

终极指南:如何用PHP轻松实现网页截图与PDF生成

终极指南&#xff1a;如何用PHP轻松实现网页截图与PDF生成 【免费下载链接】browsershot Convert HTML to an image, PDF or string 项目地址: https://gitcode.com/gh_mirrors/br/browsershot 你是否曾经遇到过这样的困境&#xff1a;需要在PHP应用中生成网页截图&…...

REXROTH VT3006S35R1比例控制卡

REXROTH VT3006S35R1 是博世力士乐生产的一款模拟放大器卡&#xff08;比例控制卡&#xff09;&#xff0c;专门用于控制先导式比例方向阀和比例压力阀&#xff0c;是液压比例控制系统中的核心控制组件。产品定位&#xff1a;模拟放大器卡&#xff0c;用于驱动和控制工业液压比…...