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

C++语法|对象的浅拷贝和深拷贝

背景:
我们手写一个顺序栈,展开接下来的实验:
⭐️ this指针指向的是类在内存中的起始位置

class SeqStack {
public:SqeStack(int size = 10) {cout << this << "SeqStack()" << endl;pstack_ = new int[size_];top_ = -1;size_ = size;	}~SeqStack() {cout << this << " ~SeqStack()" << endl;delete[] pstack_;pstack_ = nullptr;}void push(int val) {if (full()) resize();pstack_[++top_] = val;}void pop() {if (empty()) return;--top_;}int top() { return pstack_[top_]; }bool empty() { return top_ == -1; }bool full() { return top_ == size_ - 1; }
private:int *pstack_; //动态开辟数组,存储顺序栈的元素int top_; //指向栈顶元素的位置int size_; //数组扩容的总大小void resize () {int *ptem = new int[size_ * 2];for (int i = 0; i < size_; i++) {ptmp[i] = pstack_[i];}delete[] pstack_;pstack_ = ptmp;size_ *= 2}
};

文章目录

  • 浅拷贝
  • 自定义拷贝构造
  • 为什么不用memcpy
  • 赋值操作引起的浅拷贝问题
  • 重载赋值运算符

浅拷贝

int main () {SeqStack s1(10);SeqStack s2 = s1;  //#1//SeqStack s3 = s1; #2 1和2都是调用拷贝构造//SeqStack s4; s4 = s1 #这个才是调用operator=return 0;
}

程序会直接崩溃,终端提示我们两次释放相同的内存空间,造成内存泄漏。
这是由于代码SeqStack s2 = s1;明显是调用了默认的拷贝构造函数,默认的拷贝构造其实是一个浅拷贝。
可以看如下图:
在这里插入图片描述
所以说在析构的时候,先析构s2,导致我们new int[10]这块内存就已经没有了,s1中的pstack_成为了一个野指针,我们在析构一个已经释放了的内存。

总结:
对象默认的拷贝构造事做内存的数据拷贝。
关键是对象如果占用了外部资源,那么浅拷贝就出现问题了。
如果之后我们发现一个对象有一个指针,并且这个指针还指向一个外部的(堆)上的内存,所以我们一定要警防浅拷贝。

此时我们一定不能依靠编译器为我们自动生成的拷贝构造

自定义拷贝构造

SeqStack(const SeqStack &src) {//以下就是默认的浅拷贝操作//pstack_ = src.pstack_;//top_ = src.top_;//size_ = src.size_;pstack_ = new int[srtc.size_];for (int i = 0; i <= src.top_; ++i) {pstack_ = src.pstack_;}top_ = src.top_;size_ = src.size_;
}

在这里我们就对指针类型做了一个深拷贝。

为什么不用memcpy

我们在进行数据拷贝的时候,都是用的for循环,而不用memcpy,这是为什么呢?

在这里插入图片描述
如图所示,我们需要把小内存的数据全部放到大内存上来实现扩容,或者数据的迁移。

因为我们在进行数据拷贝的时候,假如我们要把这块内存上的数据拷贝到那块内存上,如果这块内存上的数据仅仅是里面放int型,但是每一个整型都不占用该整型之外的资源(堆上的资源),就是说这块内存本身就只是放了一块值而已。

那使用内存的memcpy拷贝到那块大内存中,那是没有任何问题的。

那我们假设一下,这个数组里面放的不是整型,而是对象,而且每一个对象里面都有指针,而且还指向了外部的资源,也就是说这个数组里面存的对象的浅拷贝是有问题的。

比如说我们的ptmp[i]里面放的不是整型而是对象,那么我用memcpoy的话就只是把对象本身的内存拷贝了一份,这做的都是浅拷贝的操作

浅拷贝的问题就是,让我们拷贝完的对象里面由于指针跟我们原来对象内存里面的指针指向的都是同一块资源,等我们拷贝完之后,删除小内存中的对象,会自动调用析构函数,析构函数会释放对象资源,那不就直接把我们打指针对象指向的那块堆内存也释放掉了。导致我们拷贝的那些对象的指针都成为了野指针。
在这里插入图片描述
所以说面向对象编程里面,数据的拷贝必须得用for循环来防止内存泄漏的问题

赋值操作引起的浅拷贝问题

int main () {SeqStack s1(10);SeqStack s2 = s1;  //#1//SeqStack s3 = s1; #2 1和2都是调用拷贝构造//SeqStack s4; s4 = s3; //赋值操作=》做直接的潜拷贝return 0;}
}

同理,如果我们不在类里面不重载赋值运算符,编译器会为我们调用默认的赋值操作。

我们仍然会在第二次析构的时候出现问题。

所以我们需要重载赋值运算符operator=

重载赋值运算符

void operator= (const SeqStack &src) {pstack_ = new int[srtc.size_];for (int i = 0; i <= src.top_; ++i) {pstack_ = src.pstack_;}top_ = src.top_;size_ = src.size_;
}

至此,完美解决。

相关文章:

C++语法|对象的浅拷贝和深拷贝

背景&#xff1a; 我们手写一个顺序栈&#xff0c;展开接下来的实验&#xff1a; ⭐️ this指针指向的是类在内存中的起始位置 class SeqStack { public:SqeStack(int size 10) {cout << this << "SeqStack()" << endl;pstack_ new int[size_];t…...

行为型模式

模板方法模式 #include<iostream> #include<string> using namespace std;/*案例&#xff1a;写简历内容&#xff1a;最近有个招聘会&#xff0c;可以带上简历去应聘了。但是&#xff0c;其中有一家公司不接受简历&#xff0c;而是给应聘者发了一张简历表&#xf…...

AI大模型日报#0515:Google I/O大会、 Ilya官宣离职、腾讯混元文生图大模型开源

导读&#xff1a;欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-34B&#xff09;生成了今日要点以及每条资讯的摘要。 《AI大模型日报》今日要点&#xff1a;谷歌…...

计算机网络-负载均衡算法

计算机网络中的负载均衡算法是决定如何将请求分发到各个服务器的关键。目前负载均衡算法主要分为静态负载均衡算法和动态负载均衡算法&#xff0c;具体包括以下几种&#xff1a; 静态负载均衡算法&#xff1a; 1.轮询法&#xff08;Round Robin&#xff09;&#xff1a;按照顺…...

Excel Module: Iteration #1 EasyExcel生成下拉列表模版时传入动态参数查询下拉数据

系列文章 EasyExcel生成带下拉列表或多级级联列表的Excel模版自定义校验导入数据(修订) 目录 系列文章前言仓库一、实现1.1 下拉元数据对象1.2 构建下拉元数据的映射关系1.3 框架方式1.3.1 框架实现1.3.2 框架用例模版类加载下拉业务导出接口 1.4 EasyExcel方式1.4.1 EasyExce…...

【回溯算法】【Python实现】TSP旅行售货员问题

文章目录 [toc]问题描述回溯算法Python实现时间复杂性 问题描述 给定一组城市和它们之间的距离矩阵&#xff0c;找到一条距离最短的路径&#xff0c;使得旅行商从一个城市出发&#xff0c;经过所有城市恰好一次&#xff0c;并最终回到出发城市 回溯算法 旅行售货员问题的解空间…...

Java处理xml

Java处理xml DOM&#xff08;Document Object Model&#xff09;读取写入参考文献[Java DOM 教程](https://geek-docs.com/java/java-tutorial/dom.html#ftoc-heading-5) DOM&#xff08;Document Object Model&#xff09; Java的DOM&#xff08;Document Object Model&#…...

软考中级-软件设计师 (十一)标准化和软件知识产权基础知识

一、标准化基础知识 1.1标准的分类 根据适用的范围分类&#xff1a; 国际标准指国际化标准组织&#xff08;ISO&#xff09;、国际电工委员会&#xff08;IEC&#xff09;所制定的标准&#xff0c;以及ISO所收录的其他国际组织制定的标准。 国家标准&#xff1a;中华人民共和…...

pytest教程-46-钩子函数-pytest_sessionstart

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_report_testitemFinished钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_sessionstart钩子函数的使用方法。 pytest_sessionstart 是 Pytest 提供的一个钩子函数&#xff0c…...

Windows内核函数 - ASCII字符串和宽字符串

本章介绍了Windows内核中字符串处理函数、文件读写函数、注册表读写函数。这些函数是DDK提供的运行时函数&#xff0c;他们比标准C语言的运行时函数功能更丰富。普通的C语言运行时库是不能在内核模式下使用的&#xff0c;必须使用DDK提供的运行时函数。 和应用程序一样&#xf…...

从零开始学习MySQL 事务处理

事务处理与ACID特性 事务是数据库操作的基本单元&#xff0c;它确保一组操作要么全部成功&#xff0c;要么全部失败&#xff0c;以此来维护数据库的一致性。这四个字母缩写ACID代表了事务的四大特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;**&#xff1a;事务被…...

字符数组以及字符串相关的几个函数

一.字符数组 1.定义&#xff1a;格式如下 char a[10]; //此处就表示定义了一个长度为10的字符数组 2.引用&#xff1a; 也和其余的数组一样&#xff0c;是下标引用。 3.初始化&#xff1a; 如下代码为字符数组初始化的几种情况&#xff1a; int main() {char arr[5] {…...

AOP面向切面编程

1&#xff0c;注入依赖 <!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</grou…...

C# WinForm —— 15 DateTimePicker 介绍

1. 简介 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 dtp 开头Format设置显示时间的格式&#xff0c;包含Long&#xff1a; Short&#xff1a; Time&#xff1a; Custom&#xff1a;采用标准的时间格式 还是 自定义的格式CustomFormat自定…...

SpringBoot中六种批量更新Mysql 方式效率对比

SpringBoot中六种批量更新Mysql 方式效率对比 先上结论吧,有空可以自测一下,数据量大时运行一次还时挺耗时的 效率比较 小数据量时6中批量更新效率不太明显,根据项目选择合适的即可,以1万条为准做个效率比较,效率从高到低一次排名如下 replace into和ON DUPLICATE KEY效率最…...

【SpringBoot】SpringBoot整合jasypt进行重要数据加密

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4d5;jasypt简介 &#x1f525;SpringBoot使用jasypt &#x1f4c2;创建我需要的数据库文件 &#x1f4d5;引入依赖 &#x1f513;配置数据库文件&#xff08;先不进行加密&#xff09; &#x1f319;创…...

【Go语言入门学习笔记】Part1.梦开始的地方

一、前言 经过一系列的学习&#xff0c;终于有时间来学习一些新的语言&#xff0c;Go语言在现在还是比较时髦的&#xff0c;多一个技能总比不多的好&#xff0c;故有时间来学一下。 二、配置环境 按照网络中已有的配置方法配置好&#xff0c;本人采用了Jetbrain的Goland&#…...

数据特征降维 | 主成分分析(PCA)附Python代码

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维技术和探索性数据分析方法,用于从高维数据中提取出最重要的特征并进行可视化。 PCA的基本思想是通过线性变换将原始数据投影到新的坐标系上,使得投影后的数据具有最大的方差。这些新的坐标轴称为主成分…...

当服务实例出现故障时,Nacos如何处理?

当服务实例出现故障时&#xff0c;Nacos的应对策略 在微服务架构日益盛行的今天&#xff0c;服务之间的稳定性与可靠性成为了我们架构师们不得不面对的重要课题。尤其是在面对服务实例出现故障时&#xff0c;如何确保整个系统的稳定运行&#xff0c;成为了我们首要考虑的问题。…...

遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录 TIF图像转JPGTIF标签转PNG图像重叠裁剪图像重命名数据集转COCO格式数据集转VOC格式 遥感图像不同于一般的自然图像&#xff0c;由于波段数量、图像位深度等原因&#xff0c;TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例&#xff0c;制作能够直接用…...

别再死磕PSO了!用Python手把手教你实现GWO灰狼优化算法(附完整代码)

用Python实战GWO灰狼优化算法&#xff1a;告别传统优化方法的局限 在工程优化和机器学习领域&#xff0c;算法选择往往决定了问题求解的效率和质量。传统粒子群优化(PSO)算法虽然广为人知&#xff0c;但其参数调节复杂、易陷入局部最优的缺点也日益明显。灰狼优化算法(Grey Wol…...

ISTA 2A-2011 (2022) 全解析|≤68kg 包装件部分模拟运输测试指南

前言ISTA 2A-2011 (2022) 属于 ISTA 2 系列部分模拟性能测试&#xff0c;专门面向 **≤68kg&#xff08;150lb&#xff09;的单个小型运输包装件 **&#xff0c;是电商小件、3C 数码、小家电、仪器仪表最常用的入门级包装验证标准。它结合基础测试与仿真要素&#xff0c;快速验…...

长期使用Taotoken服务在延迟与可用性方面的主观回顾

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Taotoken服务在延迟与可用性方面的主观回顾 1. 引言 在近一年的项目开发与维护周期中&#xff0c;我们团队持续将Taotoke…...

AI技能框架实战:构建可扩展的智能体工具调用系统

1. 项目概述&#xff1a;当AI技能成为你的私人助理 最近在折腾AI应用开发的朋友&#xff0c;可能都绕不开一个核心问题&#xff1a;如何让大语言模型&#xff08;LLM&#xff09;不只是个“聊天高手”&#xff0c;而是能真正帮你处理具体事务的“实干家”&#xff1f;比如&…...

3步解决网盘下载限速难题:一站式直链解析工具实战指南

3步解决网盘下载限速难题&#xff1a;一站式直链解析工具实战指南 【免费下载链接】netdisk-fast-download 聚合多种主流网盘的直链解析下载服务, 一键解析下载&#xff0c;已支持夸克网盘/uc网盘/蓝奏云/蓝奏优享/小飞机盘/123云盘等. 支持文件夹分享解析. 体验地址: https://…...

终极解决方案:3分钟轻松解决腾讯游戏ACE-Guard卡顿问题

终极解决方案&#xff1a;3分钟轻松解决腾讯游戏ACE-Guard卡顿问题 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 还在为腾讯游戏中的ACE-Guard进程占用…...

环境科学家都在偷偷用的NotebookLM技巧(2024中科院实测TOP5插件清单)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;NotebookLM在环境科学研究中的范式变革 传统环境科学研究长期受限于多源异构数据整合困难、跨学科知识理解门槛高、因果推断缺乏可解释性支持等瓶颈。NotebookLM 作为基于用户自有文档构建的语义增强型AI协作…...

基于Arduino Yun的DIY无线安防摄像头:运动检测、云端同步与实时流媒体

1. 项目概述与核心价值 手头有个闲置的Arduino Yun和USB摄像头&#xff0c;一直琢磨着怎么把它们利用起来&#xff0c;做个有点意思的东西。市面上那些无线监控摄像头功能是挺全&#xff0c;但总觉得少了点“掌控感”&#xff0c;数据存在哪里、怎么访问&#xff0c;都得听厂家…...

从IoU到Shape-IoU:如何让损失函数“看见”边界框的形状与尺度

1. 边界框回归的进化史&#xff1a;从IoU到Shape-IoU 目标检测任务中&#xff0c;边界框回归就像给物体"画框"的过程。早期的IoU&#xff08;Intersection over Union&#xff09;指标简单直观——用预测框和真实框的交集面积除以并集面积。这个指标在2016年之前是绝…...

Obsidian笔记AI化:AnythingLLM带来的知识管理革新

Obsidian笔记AI化&#xff1a;AnythingLLM带来的知识管理革新 【免费下载链接】anything-llm The all-in-one AI productivity accelerator. On device and privacy first with no annoying setup or configuration. 项目地址: https://gitcode.com/GitHub_Trending/an/anyth…...