C++——内存管理+模块

news2024/10/1 21:41:45

作者:几冬雪来 

时间:2023年5月19日

内容:C++——内存管理+模块

目录

前言:  

1.new和delete操作自定义类型: 

operator new/delete: 

定位new表达式(placement-new): 

malloc/free和new/delete区别:

2.模板: 

结尾: 


前言:  

在上一篇博客中我们成功的对我们的类和对象的知识进行了收尾工作,并且加入了内存管理这个新的知识点,今天就进一步对其进行讲解。 

1.new和delete操作自定义类型: 

在上一篇博客中,我们引入的新的操作符——new和delete

并且对它们两个新操作符的作用,写法还有和C语言中malloc,realloc。calloc的哪里有所不同都一一进行了讲解。  

在这里我们可以看出来。

new的时候这里我们的代码会去调用构造函数,同时在delete的时候也会去调用我们的析构函数

因此以后绝大部分地方我们都会用new和delete来代替我们的free和malloc

同时在new对数组进行初始化的时候,如果在这里我们是多参数的情况就需要这样书写。 

同样的在这里我们也会对其进行优化。 

当然,在一般情况下如果我们像上面这样写的话,只给3个是不行的

这里我们就需要默认构造来对其进行实现才能正常使用,如果没有默认构造我们就要用4个

 

对比下来在动态申请内置类型的数据的时候

new/malloc除了用法上,其他方面并没有什么区别

但是在动态申请自定义类型的数据的时候。

new/malloc除了用法上,还有一个中大区别,new和delete会调用构造函数初始化,析构函数情理

operator new/delete: 

在讲解了我们的new和delete之后。

接下来我们就来讲解两个操作符之间的底层构造。  

在这里我们的operator new/delete并不是直接运算符重载,而是全局函数,是库里面的函数

 

new它的底层和malloc的底层是大致相同

同时我们的delete也是和free一样

因此我们可以在代码中对free和malloc进行修改。  

从这里也可以空间,在用法上我们的operator new和malloc是一样的

但是它们所产生的价值却是不一样的

那么我们就来对其讲一讲。

这里在我们malloc的时候如果我们申请空间失败的话,在这里是返回空

这一点和我们C++中的new有所不同

在这里C++中,如果面向对象语言处理失败,不喜欢用返回值,更建议使用抛异常

而我们的异常是要被捕获的。 

这也就解释了为什么我们的operator new在全局中,因为它是独属于给new进行使用的

同时通过上面的话我们也可以看出。

new在开空间的时候先去调用operator new,然后operator new再去调用我们的malloc

但是在需要申请一个堆上的栈对象delete又是相反,我们是先调用析构再释放空间。 

这里是3块空间,一个是指针,在我们malloc函数的栈里面,一个是栈对象,它在堆上,在我们的栈对象中有一个指针指向我们的空间还是在栈对象上

通过上面的讲解,我们也可以可以判断出来,C语言和C++相对比除了有用法上的区别

还有失败时候也存在区别。 

那么从此以后,我们就不用像C语言那样进行判断是否失败返回为空的操作,而是用到我们的捕获

也就是我们这里的try...catch,这里我们就简单的看一下它的写法即可。

在上面说过,现在我们可以用new去替代我们的malloc,但是这并不意味着malloc就毫无作用了,它只是隐藏在里面使用了。 

定位new表达式(placement-new): 

接下来我们来了解一下new的其他的用法。

对一块已有的空间调用构造函数。 

在这里我们就可以显示的调用构造函数。 

这里我们的p1是内置类型不会自动的调用析构,所以我们也要显示调用析构函数

但是这种方法在我们现在看来并没有什么用。 

这里如果对其使用的话就要了解到我们的池化技术。 

而我们的池化技术包括了:内存池,连接处,线程池等等

 在这里我们的池就是用来方便我们的。

简单的举个例子:以前我们每次要买笔记本,笔什么的都要先去找到父母要到钱,但是我们的池化技术就类似把买文具的钱放在某个盒子里,放在一固定位置,需要的时候就直接去拿,这里就能方便我们自己

malloc/free和new/delete区别:

2.模板: 

讲解完了内存管理,接下来我们就要讲解C++的一个非常非常重要的知识点——模板

在以后我们学习很多知识都需要用到模板。

像我们这里如果要去执行不同类型的值的互换,那么在这里我们就需要写很多个函数对其一一匹配

那么在这里在这里我们就要使用到我们的模板。 

在模板这里我们又将其分为函数模板和类模板。 

在这里就是我们模板的代码书写。 

接下来我们就来写一个完整的代码对其进行更加详细的分析。 

这里我们就通过了模板来使值进行了交换

同时在使用了模板之后,上面的3种不同类型交换值的写法我们就可以不用写了

但是这里要知道的一个点是:

虽然我们调用了模板,可以在这里我们并非调用的同一个函数。 

这里我们的模板通过判断传的参数是整形,浮点型来推演出我们的函数

这一个过程被我们称为模板的实例化。 

但是这里我们实际调用的并不是模板,而是模板生成的函数,最后还是编译器生成的函数。 

同样的这里我们也可以来交换日期类函数。

结尾: 

到这里我们又小小的结束了一个小板块的知识,也学习了下一个板块的些许内容。在这里我们的类和对象,动态管理都是十分重要的知识板块,有时间一定要去复习和做题去巩固知识。最后希望这篇博客能带来帮助。

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

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

相关文章

横向对比 11 种算法,多伦多大学推出机器学习模型,加速长效注射剂新药研发

内容一览:长效注射剂是解决慢性病的有效药物之一,不过,该药物制剂的研发耗时、费力,颇具挑战。对此,多伦多大学研究人员开发了一个基于机器学习的模型,该模型能预测长效注射剂药物释放速率,从而…

软件物料清单:打开软件资产黑匣子的关键钥匙

大家有没有遇到过,手机被免费召回维修的情况? 有些人可能遇到这样的问题,手机购买一段时间后,突然收到手机品牌官方发布的通知:听筒模块上的某个组件可能会发生故障,会出现拨打或接听电话时听筒发不出声音的…

接口自动化【五】(HandleRequests类的封装,及postman上下接口依赖的初步认识)

文章目录 前言一、封装发送请求的操作二、迷惑的知识点三、postman的全局变量机制总结 前言 所有的封装就是一种思想,这种思想能不能想到,其实跟写代码建立思维有很大的关系。 下面也是我学到的一种思想,其中对每个函数有解读。以及易错点的…

算法小课堂(九)分支限界法

一、概述 1.1概念 分支限界法是一种求解最优化问题的算法,常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。其基本思想是把问题的可行解展开,再由各个分支寻找最佳解。 在分支限界法中,分支是使用广…

Go 语言核心编程-环境入门篇

第 1 章 Golang 开山篇 1.1 Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2 Golang 的应用领域 1.2.1区块链的应用开发 1.2.2后台的服务应用 1.2.3云计算/云服务后台应用 1.3 学习方法的介绍 1.4 讲课的方式的说明 努力做到通俗易懂注重 Go 语言体系&…

【软件测试项目】湖南交警一网通测试计划_2.0正版

目录 一、引言 1.1 编写目的 1.2 项目背景 1.3 适用范围 1.4 专业术语 二、测试任务 2.1 测试范围 2.2 测试目标 2.3 参考文档 2.4 提交文档(交付件) 三、测试进度 四、测试资源 4.1 人力资源 4.2 环境资源 4.3 测试工具 五、测试策略 5.1 功能测试 5.2 压力…

vue中 process.env与process.VUE_CLI_SERVICE

在vue中设置环境变量离不开process.env属性,那么如何设置自定义环境变更呢? 可以通过设置.env文件或者借助process.VUE_CLI_SERVICE来设置 process process 对象是一个 global (全局变量),提供有关信息,控…

基于差分进化算法的微电网调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Java经典笔试题—day12

Java经典笔试题—day12 🔎选择题🔎编程题🥝二进制插入🥝查找组成一个偶数最接近的两个素数 🔎结尾 🔎选择题 (1)以下方法,哪个不是对add方法的重载? public class Test {public void add( in…

智慧井盖监测终端,智能井盖-以科技解决智慧城市“顽疾”,守护城市生命线

平升电子智慧井盖监测终端,智能井盖-以科技解决智慧城市“顽疾”,守护城市生命线-智慧井盖,实现对井下设备和井盖状态的监测及预警,是各类智慧管网管理系统中不可或缺的重要设备,解决了井下监测环境潮湿易水淹、电力供应困难、通讯不畅等难题…

MySQL主从复制原理

一、概述 1、什么是主从复制 主从复制是用来建立一个和 主数据库完全一样的数据库环境称为从数据库;主数据库一般是准实时的业务数据库。 2、主从复制的作用 高可用,实时灾备,用于故障切换。比如主库挂了,可以切从库。读写分离…

nginx配置监听443端口,开启ssl协议,走 https 访问

本文目录 前言一、检查 linux 服务器上的 nginx 是否安装 ssl 模块二:为 nginx 安装 ssl 模块三、nginx 开启 443 端口监听(https配置)成功配好后的效果如下遇到的问题一:证书无效遇到的问题二:连公司的网络走 https 能…

飞书自建无需代码连接Flomo的方法

飞书自建用户使用场景: 公司的飞书群里,有一个名为“新产品开发”的群组,用于讨论公司新产品的开发。该群组中设置了一个机器人,名为“新产品助手”。当群组成员在讨论中需要记录一个新的产品想法时,他们可以这个机器人…

[Halcon3D] 主流的3D光学视觉方案及原理

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法

一种高效的WS2812B控制算法——基于STM32G431CBU6的SPIDMA 1.WS2812B介绍 ws2812b是一款集控制电路与发光电路于一体的智能外控LED光源,采用单线归0码协议,每个像素点的三基色颜色可实现256级亮度显示。速率能达到1024pixel 30fps / s,故被…

什么是可信时间戳?可信时间戳电子取证有效吗?

电子数据具有脆弱性、易变性、隐蔽性、载体多样性等特点,容易被复制、删除、篡改且难以被发现。因此,电子数据在实际的司法认定过程中,很难准确鉴定其生成的时间以及内容的真实性、完整性。可信时间戳是一种公认的技术手段,可为电…

拉格朗日插值定理

拉格朗日插值法是一种函数逼近方法,通过已知的数据点构建一个多项式函数,该函数能够恰好经过这些数据点。它可以用于插值,即根据给定的离散数据点推断出未知函数在其它点上的取值。拉格朗日插值法的优点是计算简单,容易理解和实现…

从初级软件测试,到高级软件测试的必经之路

作为软件质量控制中的重要一环,软件测试工程师基本处于"双高"地位,即:地位高、待遇高,而随着软件测试行业等级越来越专业化,软件测试工程师也随即被分为不同的等级,即:初级测试工程师…

《SQUID: Deep Feature In-Painting for Unsupervised Anomaly Detection》论文阅读理解

《SQUID: Deep Feature In-Painting for Unsupervised Anomaly Detection》论文阅读理解 领域:用于医学图像的异常检测 论文地址:SQUID: Deep Feature In-Painting for Unsupervised Anomaly Detection 目录 《SQUID: Deep Feature In-Painting for Un…

5月19号软件资讯更新合集.....

ohUrlShortener 短链接系统 v2.0 发布 | 指定「打开方式」功能支持 距上一次更新版本差不多两个月,ohUrlShortener 短链接系统与昨天晚上正式发布 v2.0 版本 这个版本主要的变化: 启动性能优化:在短链接数量持续上升之后,启动系…