运算符重载中可能的深拷贝问题

c++拷贝构造函数(深浅拷贝)+运算符重载 类和对象:拷贝构造函数,赋值运算符重载 阅读详情

一般情况来说 在类中 系统会自动提供一个默认的拷贝构造函数来处理复制,但在某写状况下,类体内的成员是需要动态开辟堆内存的,如果我们不自定义拷贝构造函数而让系统自己处理,那么就会导致堆内存的所属权产生混乱,已经开辟的一端堆地址原来是属于对象a的,由于复制过程发生,b对象取得是a已经开辟的堆地址,一旦程序产生析构,释放堆的时候,计算机是不可能清楚这段地址是真正属于谁的,当连续发生两次析构的时候就出现了运行错误。

更详细的说明 在这个地址http://pcedu.pconline.com.cn/empolder/gj/c/0503/570112_1.html

 

如同我发的帖子http://topic.youkuaiyun.com/u/20100514/17/aa2ea6c2-0fb8-4fc4-b467-d08f979fa5d4.html

在

[code=C/C++]

CMatrix& CMatrix::operator=(const CMatrix &other)
{
   
if (&other == this)
    {
       
return (*this) ;
    }
    m_NumColumns
= other.m_NumColumns ;
    m_NumRows
= other.m_NumRows ;
    m_pData
= other.m_pData ;
   
return *this ;
}

[/code]

中 m_pData = other.m_pData ;
这样复制的话 肯定就是深拷贝了,一旦临时变量析构   后面的变量再析构的话 就是严重的错误。

这样改 就可以了

[code=C/C++]

CMatrix::CMatrix(const CMatrix &other)
{

m_NumColumns = other.m_NumColumns;
m_NumRows = other.m_NumRows;
m_pData = new double[m_NumColumns * m_NumRows];
memcpy(m_pData,other.m_pData,m_NumColumns * m_NumRows *sizeof(double));

} 
[/code]

LoRA学习: SX1276/SX1277/SX1278对比 Lora芯片 SX1276/SX1277/SX1278的比较SX1276/7/8是一种半双工传输的低中频收发器,配备标了标准FSK和远距离扩频Lora调制解调器。该芯片可以用于超长距离的Lora扩频通信,并且抗干扰性强,同时达到低功耗要求。1、芯片关键参数对比: 可以看出SX1276的带宽范围为 7.8~500kHz ,扩频 因子6~12,并覆盖所有可用频段。 SX1277的带宽和频段方位与 S 阅读详情

相关推荐

C++_类和对象_C++运算符重载_赋值运算符重载_利用深拷贝实现对象深度赋值运算---C++语言工作笔记058

然后我们来看看,这个赋值运算符的重载,之前我们说编译器,给我们添加了3个默认的函数, 其实还有一个,这个是operator = ,这个来对属相进行值的copy,但是是浅拷贝,提供的. 我们去看看,例子 先写person类. 定义一个*m_Age 这个变量. 然后写构造方法,Person() 可以看到这里,是new 了一个int ,因为这里m_Age,是定义了一个int类型的指针,所以,他需要在 堆区中创建这个age,然后返回个堆区中的指针,然后再,赋值给m_Age这个变量. ..

添柴程序猿的专栏 572

拷贝构造函数与拷贝赋值运算符的调用时机?

拷贝构造函数与拷贝赋值运算符的调用方式类的定义调用拷贝构造函数的情形调用拷贝赋值运算符号的情形 类的定义 class CMatrix { public: CMatrix(); // 默认构造函数 CMatrix(const CMatrix& rhs); // 拷贝构造函数 CMatrix& operator=(const CMatrix& rhs); // 拷贝赋值运算符 ... }; 调用拷贝构造函数的情形 CMatrix m1; // 调用默认构造函数 CMatrix

weixin_41174045的博客 260

wap乐购商城程序

乐购商城WAP建站程序 简单WAP商城,只要你会打字就可以建WAP商城,简单容易,易上手。 后台地址:/admin/login.asp 用户名与密码:admin

C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝

关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符 摘要: 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作。 如果对象在申明的同时马上进行的初始化操作,则称之为拷贝运算。例如: class1 A("af"); class1B=A; 此时其实际调用的是B(A)这样的浅拷贝操作。 如果对象在申明之后...

weixin_34088598的博客 810

用Socket实现基于TCP和UDP的原理探索.pdf

用Socket实现基于TCP和UDP的原理探索.pdf用Socket实现基于TCP和UDP的原理探索.pdf

读取h5文件

读取h5文件

【C++】运算符重载2-深拷贝深赋值、前加加后加加的重载

运算符重载、深拷贝、浅拷贝、前加加和后加加的重载、深赋值

weixin_56916549的博客 517

维宏系统参数资料

系统的参数设置 ,方便大家学习研究。共同学习进步

重载 = 运算符实现深拷贝

1.前面已经叙述过浅拷贝的问题,当类成员含有指针时,可以通过显示编写拷贝构造函数的方法,实现用一个类初始化另一个类的深拷贝。 2.但是如果是赋值运算,即例子中的 obj2 = obj1,则不会调用拷贝构造函数,这个时候需要通过重载 = 运算符的方式实现深拷贝, 步骤已经在代码注释中提出。 #include "iostream" using namespace std; class Loc...

玉面小fei龙的博客 1284

华三 无线AP密码修改步骤

华三无线AP配置,包含Web和命令行两种。这是FAT AP的配置,仅供参考!

七、永磁同步电机矢量控制(FOC)—MTPA控制及Simulink仿真

前面几节的内容已经完成Id=0控制策略的理论和仿真以及双闭环PI参数整定。在接下来几节中,将陆续讲解MTPA、弱磁控制等内容。

weixin_45182459的博客 8190

C++(三十六) — 等号操作符重载、&&,||不可重载

1、等号操作符重载,实现深拷贝 //等号运算符重载 // obj3=obj1;//原始的是浅拷贝,现在要重载为深拷贝 Name& operator=(Name &obj1) { //1、先释放旧的内存 if (this->m_p != nullptr) { delete[] m_p; m_...

dbsggal90047018的博客 517

基于STM32的坐姿矫正与久坐提醒系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6主控,搭配MPU6050六轴姿态传感器、HC-SR04超声波测距模块,完整实现了坐姿矫正与久坐提醒系统的全流程开发,从多传感器数据采集、数字滤波、姿态解算、坐姿判断到多模式提醒,全流程无跳步保姆式拆解,配套逐行注释可直接编译的开源代码,新手跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 437

赋值运算符“=”的重载

对于许多重要的实用类来说,仅有默认的赋值运算符函数是不够的,还需要用户根据实际需要自己对赋值运算符进行重载,已解决遇到的问题。指针悬挂就是这方面的一个典型问题。 1、指针悬挂问题   在某些特殊情况下,如类中有指针类型时,使用默认的赋值运算符函数会产生错误。例如, 例 1:关于浅层赋值的例子。 #include<iostream> #include<string.h> ...

aaqian1的博客 7547

Dify插件离线部署全攻略:从下载到安装的完整流程

本文详细介绍了Dify插件离线部署的完整流程,针对企业内网等无网络环境需求。核心步骤包括在联网环境下载插件包、在特定Python 3.12.9环境下使用专用工具进行离线重打包,以及最终在离线Dify环境中安装验证。重点解决了离线安装的核心难题,并提供了环境配置、批量处理和故障排查等实用技巧,帮助用户实现Dify插件的顺利离线部署。

seed的博客 656

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

运算符重载(二)

作用:可以输出自定义数据类型(像基本类型一样)

鲸落博客 290

半导体制造技术导论(第二版)萧宏 第五章集成电路加热工艺答案

第二次退火是在较高温度下进行,并将电阻系数较高的c49碳化硅转变为电阻系数较低的c54碳。水平式高温炉加热、垂直式高温炉加热(即传统的管式炉加热)、快速加热工艺RTP、激光镭射。8. 集成电路芯片制造过程中,会使用垫底氧化层、阻挡氧化层、栅氧氧化层、屏蔽氧化层和全。氧化是最重要的加热过程之一,是一种添加工艺,将氧气加入到硅晶圆后,在晶圆表面形成二氧。为了满足元器件性能的要求,必须利用退火工艺将晶格的损伤修复,使其恢复单晶结构并激活掺。工艺氮气气流下将晶舟推入炉管,升高温度,稳定温度;

goal_achieving的博客 1863

当深拷贝和等号运算符重载相遇的问题

当深拷贝和等号运算符重载相遇的时候,我们可能在很多时候会混淆,话不多说,上代码: #include<iostream> using namespace std; class father { public: father(int b) { M_a=new int(b); } //father(const father&b) //{ // // //M_a = b.M_a;//系统默认浅拷贝写法 // M_a = new int(*b.M_a);//深拷贝解决此类问

m0_53175693的博客 182

小白的MatSWMM使用心路(二)——用matlab修改INP文件参数/使用matlab查找txt内容并修改多行内容

说是修改inp,但是里面的内容大部分还是讲怎么修改txt的……(?)。包含如何找到需要的参数(关键字)位置,以及修改那个位置的txt这样的内容。希望能帮助大家吧……Matlab你要多出好用的功能啊!

weixin_44276743的博客 4530

立项书8分钟定生死?手把手教你用ChatGPT辅助打造高水平申报书,让评审专家一看就想打高分!

宏大叙事、空话堆砌只会让评审绕晕,不如聚焦一个具体问题,拿出清晰的研究路径、扎实的设计方案,把“我想做什么、为什么做、打算怎么做”讲明白。对评审来说,关键不在你读了多少,而在你能否看清领域的共识、争议和空白,GPT的作用就在于帮你理清研究脉络,发现问题结构,聚焦那些还没被充分讨论的变量或方法,去提升综述的深度。之前要用到ProcessOn、Draw.io等工具画流程图,现在有了ai虽然方便了,但也需要多次调教,如果嫌麻烦,七哥给大家准备了课题申报常用的流程图,技术路线图,方便大家直接拿来编辑填空使用。

智能AI让学术科研更容易 290

C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

C++搞懂深拷贝初始化=与赋值=的区别 代码 今天在学习右值引用时,遇到了深拷贝问题,以前也知道深拷贝与浅拷贝的区别,今天的疑问是,为什么不用重载=操作符在初始化时实现深拷贝,与赋值时=号的区别。 #include <iostream> #include <functional> using namespace std; class Test { private: int *data; int s_size; public: Test(size_t size

勿在浮沙築高台 1517

Mysql授权允许远程访问

前言 Mysql授权允许远程登录后,linux中安装的mysql可以与Navicat for Mysql(可视化)等连接,在可视化软件下管理数据库。 注意:不能使用临时密码 设置密码命令: alter user 'root'@'localhost' identified by '这里是你的密码'; 授权允许远程访问 一、授权命令: grant all privileges on *.* to '...

🏆 前端领域优质创作者 3万+

讲述下C++下深拷贝和浅拷贝

某些情况下我们需要将一个对象赋给另一个对象,其中就有一些值得注意的点。 浅拷贝:  在没有进行运算符的重载时,一般情况下我们定义一个A a(1,2,3);A b;这两个对象,我们会有 b = a; 这就是对象之间的拷贝,也就是会出现深拷贝和浅拷贝,以及一些错误。首先,b = a是一个浅拷贝过程就是将一些数值进行赋值操作。这就出现一个问题,如果类中含有指针,浅拷贝就会出现问题当a对象析构时,则其

我的IT追求 6642

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

赋值运算符“=”的重载 (浅拷贝与深拷贝)

赋值运算符是双目运算符,如果没有用户自定义的赋值运算符函数,那么系统将自动地为其生成一个默认的赋值运算符函数实现对象的赋值 Complex c1(10,20),c2; 就调用默认的赋值运算符函数,将对象c1的数据成员逐一拷贝到对象c2中,即 c2.real=20; c2.imag=10; 虽然默认的赋值运算符函数能够实现很多拷贝,但是有很多时候它是不行的,这时需要自己对赋值运算符进行重载

nyist_yangguang的博客 2240

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++赋值运算符重载及深拷贝 浅拷贝

转载:https://www.cnblogs.com/zsq1993/p/5791130.html   向大佬致敬 关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符 摘要:     在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作。     如果对象在申明的同时马上进行的初始化操作,则称之为拷贝运算。例如:         class1 A("af"); ...

xuyunyunaixuexi的博客 748

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: CFolderDialog,CFolderPickerDialog选择文件夹及获得当前程序路径
下一篇: vc平台下的简单PID实现
洗洗睡去
博客等级 码龄19年 0粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值