c++深拷贝和浅拷贝的区别

在 C++ 中,深拷贝(deep copy)和浅拷贝(shallow copy)是与对象拷贝相关的概念

浅拷贝(Shallow Copy):

  • 浅拷贝是指将一个对象的值复制到另一个对象,但如果对象中包含指针成员,则只会复制指针的地址,而不会复制指针所指向的内容。这意味着两个对象将共享同一块内存空间。
  • 这意味着,如果原始对象和拷贝对象共享同一块内存,当其中一个对象修改了这块内存中的数据时,另一个对象中的数据也会被修改,因为它们指向同一块内存区域。这可能导致意外的数据修改或释放问题
应用场景
  • 对象没有动态分配内存:如果一个类中的数据成员都是基本数据类型(如 int、float、char 等)或者其他不需要手动释放内存的类型,那么进行浅拷贝就足够了。因为这些数据成员的复制只涉及到值的复制,不会涉及资源管理的问题。
  • 资源共享的场景:有时候,我们希望多个对象共享某些资源,比如共享一个文件句柄、共享一个计数器等。在这种情况下,浅拷贝可以很好地满足需求,因为多个对象共享同一份资源,可以减少资源的重复占用。
  • 性能考虑:相比深拷贝,浅拷贝的成本更低。如果在某些情况下,对象的复制操作需要频繁进行且数据成员无需独立管理内存,那么选择浅拷贝可以提高效率。
注意

在使用浅拷贝时,要确保不会出现悬空指针、内存泄漏等问题。对于包含指针成员的类,如果这些指针指向的是动态分配的内存,可能会导致浅拷贝带来的问题。因此,在设计类时需要慎重考虑是否适合使用浅拷贝,以避免潜在的资源管理错误。

深拷贝(Deep Copy):

  • 深拷贝是指在拷贝对象时,会创建一个新的对象,并将原始对象的所有内容都复制到新对象中,包括指针所指向的内容。
  • 这样就会完全复制原始对象的所有数据,即使原始对象和拷贝对象分别进行了修改,彼此之间也不会相互影响。
应用场景
  • 类中包含指针成员:当一个类中包含指针成员时,进行浅拷贝将会导致多个对象共享同一块内存空间,容易出现数据修改或释放问题。在这种情况下,使用深拷贝可以复制指针所指向的内容,并确保原始对象和拷贝对象互不影响。
  • 动态分配内存:如果类中使用了动态分配的内存(例如通过 new 或 malloc 分配内存),并且希望在拷贝对象时也复制这些动态分配的内存,以避免内存释放问题,那么需要使用深拷贝。
  • 避免浅拷贝带来的问题:如果使用默认的拷贝构造函数或赋值运算符进行浅拷贝,可能会导致多个对象共享同一块内存空间,容易出现数据修改或释放问题。在这种情况下,使用深拷贝可以避免这些问题。
注意

在类中包含指针成员或动态分配的资源,希望确保拷贝对象与原始对象独立存在时,使用深拷贝是必要的。需要注意的是,在使用深拷贝时,除了拷贝构造函数,还需要正确实现析构函数、拷贝赋值运算符等相关函数,以便正确地管理动态分配的资源,避免内存泄漏和悬空指针等问题。

DeepCopyExample类实现了深拷贝的方式,确保在拷贝对象时,动态分配的内存也得到复制。因此,即使原始对象和拷贝对象分别进行了修改,它们的数据之间也不会相互影响。
相比之下,浅拷贝则只是简单地复制指针的地址,这可能导致多个对象共享同一块内存,容易出现意外的数据修改行为。因此,在设计类的时候,需要根据实际需求选择适合的拷贝方式,以避免潜在的问题。
#include <iostream>class DeepCopyExample {
private:int* data;public:DeepCopyExample(int value) {data = new int(value);}DeepCopyExample(const DeepCopyExample& other) {data = new int(*other.data);  // 进行深拷贝}void setData(int value) {*data = value;}int getData() const {return *data;}~DeepCopyExample() {delete data;  // 释放动态分配的内存}
};int main() {DeepCopyExample original(5);DeepCopyExample copy(original);  // 调用拷贝构造函数进行深拷贝std::cout << original.getData() << " " << copy.getData() << std::endl;  // 输出 "5 5"original.setData(10);std::cout << original.getData() << " " << copy.getData() << std::endl;  // 输出 "10 5"return 0;
}

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

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

相关文章

【QT】创建第一个QT程序

下面的前7个可以先不看&#xff0c;直接从8开始看 1. 创建Qt程序 一个Qt程序的组成部分&#xff1a;应用程序类&#xff0c;窗口类应用程序类个数&#xff1a;有且只有一个QApplication a;如何查看类对应的模块&#xff1a;光标移动到类上&#xff0c;F1qmake模块的名字 2. …

Redis的主从、哨兵、集群模式的概念及搭建步骤

主从复制 主从模式也叫主从复制&#xff0c;主是主服务器&#xff0c;从是从服务器&#xff0c;主服务器&#xff08;master &#xff09;的数据如果更新了 也会同步到从服务器&#xff08;slave&#xff09;&#xff0c;一个主服务器可以搭配很多个从服务器&#xff0c;主服务…

【设计模式】(四)设计模式之工厂模式

1. 工厂模式介绍 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式有三种实现方式&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 2. 工厂方…

前后端分离项目,如何解决跨域问题?

跨域问题是前后端分离项目中非常常见的一个问题&#xff0c;举例来说&#xff0c;编程猫学习网站的前端服务跑在 8080 端口下&#xff0c;后端服务跑在 9002 端口下&#xff0c;那么前端在请求后端接口的时候就会出现跨域问题。 403 Forbidden 是HTTP协议中的一个状态码&#x…

华容道问题求解_详细设计(五)之hash值和回放功能

&#xff08;续上文&#xff09; 布局的hash 值计算 笔者也参考了之前的一些文章&#xff0c;很多文章提到了怎么节省存贮空间来查找最优解&#xff0c;这不是笔者的目的。笔者的目的比较单一&#xff0c;就是找到最优解就行了。因此并没有在存贮上面进行过多的优化&#xff…

Linux系统adb调试小米手机调试不成功出现Exception occurred while executing ‘put‘:问题解决

参考文章&#xff1a;执行android settings命令报错原因Exception occurred while executing put: java.lang.SecurityException: Pe... - 简书 (jianshu.com) 解决Android U无法通过adb安装应用(Caller has no access to session -1)的问题_performing streamed install-CSDN…

P3405 [USACO16DEC] Cities and States S题解

题目 Farmer John有若干头奶牛。为了训练奶牛们的智力&#xff0c;Farmer John在谷仓的墙上放了一张美国地图。地图上表明了每个城市及其所在州的代码&#xff08;前两位大写字母&#xff09;。 由于奶牛在谷仓里花了很多时间看这张地图&#xff0c;他们开始注意到一些奇怪的…

消息队列 MQ

文章目录 1. MQ 相关概念1.1 什么是 MQ1.2 为什么要用 MQ1.3 MQ 分类1.4 MQ 的选择 1. MQ 相关概念 1.1 什么是 MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#x…

【 React 】state和props有什么区别?

1. state 一个组件的显示形态可以由数据状态和外部参数所决定&#xff0c;而数据状态就是state&#xff0c;一般在constructor中初始化 当需要修改里面的值的状态需要通过调用setState来改变&#xff0c;从而达到更新组件内部数据的作用&#xff0c;并且重新调用组件render方法…

阿里云DSW做AI绘画时的显卡选择A10?V100?

V100是Volta架构&#xff0c;A10是Ampere架构&#xff0c;架构上讲A10先进点&#xff0c;其实只是制程区别&#xff0c;用起来没区别。 V100是HBM的内存读取&#xff0c;带宽大&#xff0c;但是DDR5的。 二块卡都是全精度为主的算力卡&#xff0c;半精度优势不明显。 需要用…

uniapp 开发app,如何使用模拟器

1、开发app &#xff0c;设置模拟器 &#xff08;uniapp 如何设置模拟器&#xff09; https://blog.csdn.net/sweetsoft/article/details/130727169 2、运行到模拟器 注意&#xff1a;1、模拟器所在的位置&#xff1a;“D:\Program Files\Nox\bin”&#xff0c;在该文件夹下找…

FPN(Feature Pyramid Network)

参考&#xff1a; 【目标检测】FPN(Feature Pyramid Network) - 知乎 Feature pyramid network是CVPR2017年的一篇文章&#xff0c;它在目标检测中融入了特征金字塔&#xff0c;提高了目标检测的准确率&#xff0c;尤其体现在小物体的检测上。 1. 动机(Motivation) 识别不同…

【三两波折】char *foo[]和char(*foo)[]有何不同?

1、先谈优先级 最高级别 —— 有四个&#xff0c;他们并不像运算符&#xff1a; []数组下标左到右结合()用于&#xff08;表达式&#xff09; or 函数名(形参表)左到右结合.读取结构体成员左到右结合->读取结构体成员&#xff08;通过指针&#xff09;左到右结合 第二级别…

【读书笔记】针对ICS的ATTCK矩阵详解(一)

Techniques - ICS | MITRE ATT&CKhttps://attack.mitre.org/techniques/ics/ 一、初始访问&#xff08;Initial Access&#xff09; 该阶段&#xff1a;攻击者正在尝试进入ICS环境。 初始访问包括攻击者可能用作入口向量&#xff0c;从而可以在 ICS 环境中获得初始立足点的…

pytorch实现分割模型TransUNet

TransUNet是一个非常经典的图像分割模型。该模型出现在Transformer引入图像领域的早期&#xff0c;所以结构比较简单&#xff0c;但是实际上效果却比很多后续花哨的模型更好。所以有必要捋一遍pytorch实现TransUNet的整体流程。 首先&#xff0c;按照惯例&#xff0c;先看一下…

逼疯快递员的送货上门,谁来背锅?

快递上门的问题近几年来一直争论不休。 最近&#xff0c;随着新修订的《快递市场管理办法》正式实施&#xff0c;这个话题又成为了焦点。 消费者希望快递能够送上门省去麻烦&#xff0c;快递员希望统一送到代收点提高效率。 是消费者要求太高&#xff1f;快递员太过怠慢&…

LightDB24.1插件oracle_fdw需要支持oracle.date和oracle.varchar2类型

背景介绍 oracle.date和oracle.varchar2是LightDB中新增的类型&#xff0c;对应于Oracle数据库的date和varchar2类型。oracle_fdw是第三方插件&#xff0c;所以不支持oracle.date和oracle.varchar2类型。从LightDB24.1版本开始&#xff0c;oracle_fdw插件开始支持oracle.date和…

理解自相关图AC和偏自相关图PAC Plots

when we talk about the time-series data, many factors affect the time series, but the only thing that affects the lagged version of the variable is the time series data itself. by Yugesh Verma 时序数据按照时间点的先后顺序进行排列,变化是在邻近的时间段之间发…

2.1基本算法之枚举1978:生理周期

人生来就有三个生理周期&#xff0c;分别为体力、感情和智力周期&#xff0c;它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天&#xff0c;人会在相应的方面表现出色。例如&#xff0c;智力周期的高峰&#xff0c;人会思维敏捷&#xff0c;精力容易高…

[金三银四] 系统调用相关

2.36 系统调用的详细流程 Linux 在x86上的系统调用通过 int 0x80 实现&#xff0c;用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是&#xff1a; 应用程序调用库函数&#xff08;API&#xff09;&#xff1b;API 将系统调用号存入寄存器&#xff08;EAX&#…