C++ 浅拷贝&深拷贝

声音事件检测metric:PSDS 这项工作为多声道声音事件检测(SED)系统的性能评估定义了一个新的框架,它克服了传统的collar-based事件决定、事件F-cores和事件错误率的限制。拟议的框架引入了对事件检测的定义,该定义对标签的主观性更为稳健。它还采用了多声道接收器操作特性(ROC)曲线,以提供比F1分数更全面的系统性能洞察力,并建议将这些曲线简化为单一的多声道声音检测分数(PSDS),这允许系统独立于操作点(OPs)进行比较。所提出的方法还能更好地了解不同声音类别的数据偏差和分类稳定性。 阅读详情

在C++中,深拷贝和浅拷贝都是对象的拷贝方式,两者的主要区别是如何处理动态分类的资源.对于程序中的资源管理错误如内存泄漏、双重释放非常重要.

1、浅拷贝

  • 浅拷贝是直接复制对象的成员变量的值.如果对象包含指针或动态分配的资源,浅拷贝只会复制指针的地址,而不会复制指针指向的实际内容,所以最终两个对象会共享同一块内存.
class ShallowCopyClass {
public:
    int* data;

    // 构造函数
    ShallowCopyClass(int value) {
        data = new int(value);
    }

    // 析构函数
    ~ShallowCopyClass() {
        delete data;
    }
};

int main() {
    ShallowCopyClass obj1(10);

    // 浅拷贝:obj2 的 data 指针指向与 obj1 相同的内存
    ShallowCopyClass obj2 = obj1;

    // 修改 obj2 的 data,obj1 的 data 也会被修改
    *obj2.data = 20;
    std::cout << *obj1.data << std::endl; // 输出 20

    // 程序结束时,obj1 和 obj2 的析构函数会尝试释放同一块内存,导致双重释放
    return 0;
}

浅拷贝存在的问题

  • 共享资源: 多个对象共享同一块内存,修改一个对象会影响其他对象
  • 双重释放: 当对象析构时,多个对象的析构函数会尝试释放同一块内存,导致程序崩溃

2、深拷贝

  • 深拷贝是指不仅复制对象的成员变量的值,还为动态分配的资源分配新的内存,并复制资源的内容.这样每个对象都有独立的资源,互不干涉.
class DeepCopyClass {
public:
    int* data;

    // 构造函数
    DeepCopyClass(int value) {
        data = new int(value);
    }

    // 拷贝构造函数(深拷贝)
    DeepCopyClass(const DeepCopyClass& other) {
        data = new int(*other.data); // 分配新内存并复制内容
    }

    // 拷贝赋值操作符(深拷贝)
    DeepCopyClass& operator=(const DeepCopyClass& other) {
        if (this == &other) { // 自赋值检查
            return *this;
        }
        delete data; // 释放原有资源
        data = new int(*other.data); // 分配新内存并复制内容
        return *this;
    }

    // 析构函数
    ~DeepCopyClass() {
        delete data;
    }
};

int main() {
    DeepCopyClass obj1(10);

    // 深拷贝:obj2 的 data 指向新分配的内存
    DeepCopyClass obj2 = obj1;

    // 修改 obj2 的 data,不会影响 obj1 的 data
    *obj2.data = 20;
    std::cout << *obj1.data << std::endl; // 输出 10

    // 程序结束时,obj1 和 obj2 的析构函数分别释放各自的内存
    return 0;
}

深拷贝的优点:

  • 独立资源: 每个对象拥有独立的资源,修改一个对象不会影响其他对象
  • 避免双重释放: 每个对象的析构函数只释放自己分配的内存,不会导致双重释放

3、浅拷贝与深拷贝的适用场景

场景1: 基本数据类型

  • 浅拷贝: 安全,可以直接复制值即可
  • 深拷贝: 不需要,没有动态分配的资源

场景2: 动态分配的资源(如指针)

  • 浅拷贝: 会导致共享资源和双重释放问题
  • 深拷贝: 必须使用,以确保每个对象拥有独立的资源

场景3: 包含了其他自定义类型对象

  • 如果自定义类型实现了深拷贝,则默认行为是安全的.
  • 如果自定义类型未实现深拷贝,则需要手动实现.

场景4: 继承关系

  • 父类和子类的成员变量都需要正确处理深拷贝
  • 在拷贝构造函数和拷贝赋值操作符中,先调用父类的对应函数,再处理子类的成员变量.

4、总结:

  • 浅拷贝: 适用于没有动态资源管理的简单对象
  • 深拷贝: 适用于需要独立资源管理的复杂对象(如指针、数组、文件句柄等)

思维导图笔记:
请添加图片描述

网络层隧道技术之ICMP隧道(pingTunnel/IcmpTunnel) 目录 ICMP隧道 使用ICMP搭建隧道(PingTunnel) 使用ICMP搭建隧道(Icmptunnel) ICMP隧道 ICMP隧道简单实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ping命令就是利用的ICMP协议,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,每个ping命令都有相... 阅读详情

相关推荐

SHP转TXT、TXT转SHP工具(附工具下载链接)

关于TXT,可以选择整个图层生成一个TXT。也可以勾选“每个地块单独存TXT”,然后选择一个字段,根据字段值,给每个地块生成一个TXT文件。支持选择和数据框一样的坐标系,也可以选择一个图层,工具会采用和这个图层一样的坐标系。1、TXT数据支持输入单个或者多个TXT文件,也可以直接选择TXT所在的文件夹。所有的TXT数据都生成到一个矢量数据图层。关于这一行的内容,可以在地块坐标行设置中进行设置。其他:①面节点闭合:勾选,则回到起点。属性描述:可以直接复制粘贴进来,也可以直接修改。也可以改为任意字母。

坐听风雨 4303

22 C++ - 深拷贝和浅拷贝

1.浅拷贝 同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝。 一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。 2. 深拷贝 当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间,深拷贝。 ...

阿甘兄 1723

点云数据增强及预处理

数据增强: 1. random world flip:沿着x或者y轴,翻转点云 点云的x或者y,要翻转 3d box中心的x或者y,要翻转 3d box的朝向要翻转 point segmentation label,点云的相对顺序没有发生变化 2. random_world_rotation:沿着点云原点,旋转点云 点,x,y,绕z轴旋转 3d box,绕z轴旋转,中心和朝向都要变化 point segmentation label,点云的相对顺序没有发生变化 3. random_world_scaling

huang_victor的博客 4011

C++:浅拷贝的解决方法(深拷贝(传统写法,现代写法),写时拷贝)

什么是浅拷贝? 第一种方法:深拷贝(传统方法) 第二种方法:深拷贝(现代简洁方法) 第三中方法:写时拷贝

赫菲斯托斯,, 1075

如何在Tagetik系统中抽取处理SAP系统财务数据

如何在Tagetik系统中抽取处理不同核算系统财务数据:以SAP为例,简单讲一下Tagetik对接SAP数据的基本情况

2201_75401663的博客 578

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1667

【C++】深入理解<深拷贝和浅拷贝>

本章的内容有: 什么是浅拷贝?什么是深拷贝?为什么要有深拷贝?如何理解浅拷贝和深拷贝?

翼同学 3059

YOLO26 多模态融合技术:RGB+红外/深度/雷达融合

YOLO(You Only Look Once)是一种流行的目标检测算法,其最大特点是快速且端到端地完成图像中所有目标的检测与分类任务。YOLO首次在2016年由Joseph Redmon等人提出,彻底改变了传统目标检测(如R-CNN系列)的思路,被广泛应用于自动驾驶、视频监控、工业质检等场景。

一键难忘的博客 3523

C++ 赋值、浅拷贝、深拷贝和零拷贝解析

1. 浅拷贝 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。 2. 深拷贝 深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。 深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的,示意图大致如下: 3. 赋值与浅拷贝差异 赋值: 把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的

cdljn2012的博客 3080

IEC 104电力规约详细解读(一) - 报文结构、报文分类、ASDU

比如,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧,当然也可以不要求(S帧内容示例参考例1)。所以U帧格式的控制欲第一个字节就只有6种情况,分别是0x83(TESTER确认)、0x43(TESTER命令)、0x23(STOPDT确认)、0x13(STOPDT命令)、0x0B(START确认)、0x07(START命令)ASDU(应用服务数据单元),协议原文格式最好去101协议去看看,会比较详细。遥信、遥测、遥控、遥调、总召、对时等都需要使用I格式传送。

张二狗的博客 1万+

解读MTF曲线

怎样看MTF曲线 光学模量传递函数所表示的就是模量传递函数值随空间频率和像场位置变化的函数关系。它有很多种类型, 但最主要的两种类型就是MTF值与空间频率的关系和与像场半径(或像场角)之间的关系。 1、什么是空间频率 在讲清MTF曲线随空间频率的变化关系以前,我们先来弄明白什么叫“空间频率”。 空间频率(Spatial Frequency)的概念与分辨率的概念非常相似,单位都是“线对/毫米”(lp/mm)。但测试分辨率的标板是一组一组轮廓鲜明的黑白线条,每两条线条之间的距离,以及线条本身的宽度之比是.

camerall 1万+

C++深浅拷贝的区别

浅拷贝:当编写一个类时,并且没有添加拷贝构造,此时系统会默认添加一个拷贝构造(浅拷贝)。浅拷贝是指:创建一个新对象时,把对象的初始属性都复制一份,若是存在引用类型,则拷贝的是其内存地址,当它的值发生改变时,另一个的值也会受到改变。深拷贝:深拷贝就是将对象从内存中完全拷贝出来,并且重新开辟一片空间来进行存放,当其中一个值发生改变时并不会影响另一个的值,两者互不影响。在C++中一般出现 赋值现象,就意味着拷贝的产生,其中拷贝的方式有两种:浅拷贝、深拷贝。值得注意的是:如果存在析构函数,则会出现指针悬挂的问题。

toubs的博客 3835

【SA8155P】AIS Camera相关内容的简单介绍

【SA8155P】AIS Camera相关内容的简单介绍

静谧、淡雅 1704

C++ 浅拷贝 & 深拷贝

C++ 对象的赋值, 赋值, 介绍浅拷贝 (shallow copy) 和深拷贝 (deep copy) 的区别.

我是小白呀的博客 9577

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C++】深拷贝&浅拷贝

在 C++ 中,当一个对象通过赋值或拷贝即将成为另一个对象的副本时,会发生“浅拷贝”或“深拷贝”。当对象中只包含了基本数据类型成员时,可以使用浅拷贝;当对象中包含了指针类型成员时,需要使用深拷贝。

crr411422的博客 2761

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++——深拷贝&浅拷贝

引用: https://blog.youkuaiyun.com/lpp0900320123/article/details/39007047 http://www.cnblogs.com/zhili/p/DeepCopy.html   深拷贝: 指的是拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样进行深拷贝后的拷贝对象就和源对象互相独立,其中任何一个对象的改动都不会对...

goldcarpenter的博客 1147

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++之深拷贝&浅拷贝

什么是拷贝构造函数? 通过拷贝对象的方式创建一个新的对象,拷贝构造函数的参数必须是类对象的引用,也就是将一个对象拷贝给另一个新建的对象(用途,在创建对象的时候,使用同一类之前创建的对象来初始化新创建的对象) Book(Book &amp;b);//必须是引用的原因是,如果是传值方式将实参传递给形参,中间要经历一个对象的拷贝,对象拷贝由必须调用拷贝构造函数,这样就形成一个死循环,无解 拷贝构造函...

王文平_Trista的博客 351

【C++ 深拷贝 & 浅拷贝】

拷贝构造函数在大多数情况下都很简单,甚至在我们都不知道它存在的情况下也能很好发挥作用,但是在一些特殊情况下,特别是在对象里有动态成员的时候,就需要我们特别小心地处理拷贝构造函数了。所谓浅拷贝,指的是在对象复制时,只是对对象中的数据成员进行简单的赋值,上面的例子都是属于浅拷贝的情况,默认拷贝构造函数执行的也是浅拷贝。此外,在与“对象的复制”很类似的“对象的赋值”的情况下,也会出现同样的问题。此时rect1的p和rect2的p各自指向一段内存空间,但它们指向的空间具有相同的内容,这就是所谓的“深拷贝”。

sinat_23896491的博客 238

15. C++ 浅拷贝 & 深拷贝

浅拷贝是指:在拷贝对象时,仅对对象的「栈区成员变量」进行「逐字节的原值拷贝」;对于对象中的「指针类型成员」,只拷贝指针变量本身存储的「内存地址」不会拷贝指针指向的堆区内存数据。深拷贝是指:在拷贝对象时,不仅对对象的「栈区成员变量」进行逐字节的值拷贝;对于对象中的「指针类型成员」,会先为新对象「重新开辟一块独立的、大小相同的堆区内存」,然后把源对象指针指向的「堆区内存数据完整拷贝」到新开辟的堆内存中,最后让新对象的指针指向这块属于自己的独立堆内存。C++标准库的容器(std::mapstd::list。

2301_78486960的博客 763

【C++】022、深拷贝&浅拷贝

移动是把源对象的指针直接置空(nullptr),并把指针值偷给目标对象,移动后的源对象处于有效但未指定的状态,他的析构函数不会再释放资源。如果一个类需要自定义析构函数释放资源,那么一定需要自定义拷贝构造函数和拷贝赋值运算符,以及C11后的移动构造和移动赋值。浅拷贝:仅仅逐字节复制对象本身的内存布局,两个对象中的指针成员指向同一块动态内存。反之,如果不需要析构函数,就不要自定义拷贝操作,直接让编译器生成默认的浅拷贝。C++中的移动语义既不是深拷贝,也不是浅拷贝,只是一种资源窃取。深拷贝会复制一份数据(昂贵)

Tim_10的博客 234

C++中的深拷贝&浅拷贝

一. 什么是拷贝构造函数 转自百度定义:拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其形参必...

feifei__wang的博客 1561

C++深拷贝&浅拷贝

先上结论: 深拷贝:拷贝的是指针所指向的一整块内存,即将指针pSrc所指向的一整块内存,拷贝出来,然后赋值给指针pDst所指向的一个区域,核心代码是 char* pDst = new char[128]; memcpy(pDst, pSrc, sizeof(pSrc)); 浅拷贝:拷贝的是指针的值,即将指针pSrc赋值给了pDst char* pDst = nullptr; pDst ...

jigetage的专栏 1049

C++ 深拷贝与浅拷贝&重载赋值运算符

在C++类的成员变量中存在指针变量的时候,就会存在深拷贝和浅拷贝问题。当使用C++编译器默认提供的拷贝构造函数或者对象的赋值操作的时候就会出现浅拷贝

mr_ahke的博客 1432

C++基础——深拷贝&浅拷贝

在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存(在堆内存中)。 可以理解为深拷贝是建了一个一模一样的副本,拷贝后共有两个实体对象。而浅拷贝只是一个链接,链接的目标还是原来的对象,实体对象数目还是一个。 采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误。 默认生成的拷贝构造函数是浅拷贝,对任何一个对象的改变都会影响

小松鼠的专栏 481

【C++核心编程】拷贝构造&赋值运算符&深拷贝浅拷贝

🔥❤️类名(const 类名& 对象名) { ... }为了避免浅拷贝带来的问题,我们通常会实现深拷贝(Deep Copy)。深拷贝会创建一个新的内存空间,并复制对象中所有指针指向的数据,而不再对拷贝对象中有对其他资源的引用的指针或引用进行单纯的赋值。这样就不会出现通过成员指针对指向数据进行修改,另外一个对象的指针成员的指向也被修改。还有一块内存被释放两次的错误。int* m_ptr;//没有重载的普通构造函数CTest() {m_age = 0;

代码兴国 1266

C++学习笔记之浅拷贝&深拷贝的理解

浅拷贝 #include "test.h" #define _CRT_SECURE_NO_WARNINGS #include&lt;iostream&gt; using namespace std; class Teacher { public: char* p; //有参构造 Teacher(const char* a) { int len = strlen(a); p =...

lynnlee_36的博客 267
上一篇: [Effective C++]条款11:在operator= 中处理“自我赋值”
下一篇: [Effective C++]条款12:复制对象时勿忘每一个成分
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值