内存管理(C++篇)

前言

我们在C语言阶段学习过内存管理的相关操作和知识,比如说malloccalloc等内存开辟函数,但我们在学的时候会发现,使用这些函数还是相对来说比较冗杂的,那么今天我们来学习C++语言中相关的内存管理操作,相信学完之后你一定会有新的收获和进步。,话不多说,我们马上步入正题。


目录

前言

1.内存分布

2.new和delete

3.关于new和delete的底层

总结


1.内存分布

这里我们最熟悉的就是栈和堆,栈是向下增长的,先开辟的地址是大地址,同理我们可以了解到堆也是这样的,其他部分我们大体了解即可。


2.new和delete

关于new和delete,我们明白C++是兼容C的,并且C++是对C语言的一个优化,因此我们结合之前C语言的学习来熟悉这两新出现的操作,以便于我们快速理解和上手。

首先我们介绍new和delete的基本使用形式

int main()
{//内存的开辟和初始化,这里是单个元素int* ptr1 = new int;int* ptr2 = new int(1);//这里是多个元素的开辟和初始化int* ptr3 = new int[10];int* ptr4 = new int[10] {0};delete ptr1;delete ptr2;delete[]ptr3;delete[]ptr4;return 0;
}

这里我们来介绍他们与C语言的malloc等函数的区别:

  • 第一,malloc,realloc等等都是函数,而是new和delete是操作符
  • 第二,对于自定义类型,malloc只涉及到开辟空间,而new还可以调构造函数进行初始化,malloc释放空间需要free,delete还会调用析构函数。

正常内置类型new和malloc没有区别,delete与free没有区别,就是代码量和形式上new和delete方便一些。

  • 第三,malloc等内存开辟函数,是void* 类型,使用时需要强转,而new不需要
  • 第四,如果开辟失败,malloc等内存开辟函数选择的是返回NULL空指针,而new是抛异常

3.关于new和delete的底层

其实new和delete的底层还是用malloc实现的

new其实是在底层调用了operator new这个全局函数,同样delete是调用了operator delete函数

它们两个作为操作符,会让我们马上想起之前在C++入门中学过的运算符重载的相关知识。

了解到这些,突然发现new和delete也没有我们想象中的那么神秘了。

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{// try to allocate size bytesvoid *p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0)
{// report no memory// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);
}return (p);
} /
*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK); /* block other threads */__TRY/* get a pointer to memory block header */pHead = pHdr(pUserData);/* verify block type */_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK); /* release other threads */__END_TRY_FINALLYreturn;
} /
*
free的实现
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

我们也可以大体了解一下二者的底层代码。


总结

今天主要和大家分享了C++中实现内存管理的一些内容,希望大家有所收获。

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

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

相关文章

母婴电商企业案例:日事清驱动项目管理执行与OKR目标管理的流程自动化实践

一、关于科木电商 “小鹿豆豆”,一个年轻的品牌,近期在无论是淘宝、拼多多还是抖音电商平台,都成了亮眼的爆品。这个由绵阳科木电子商务有限公司推出的新品牌,以其高品质的保湿云柔巾迅速赢得了母婴护理市场的青睐,特别…

图数据库Neo4j和JDK安装与配置教程(超详细)

目录 前言 一、Java环境配置 (一)JDK的下载与安装 (二)JDK环境配置 (三)检测JDK17是否配置成功 二、Neo4j的安装与配置 (一)Neo4j的下载与安装 (二)N…

git原理与常用命令及其使用

认识工作区、暂存区、版本库 ⼯作区:是在电脑上你要写代码或⽂件的⽬录。 暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index&#xf…

Web-Machine-N7靶机通关攻略

获取靶机ip arp-scan -l 端口扫描 nmap xxxx 访问80端口发现没用 扫描目录 gobuster dir -u http:/192.168.117.160 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium,txt -x php,html,txt ,zip 打开exploit.html 点击F12,修改localhost为靶机ip&#…

2025-03-21 Unity 网络基础3——TCP网络通信准备知识

文章目录 1 IP/端口类1.1 IPAddress1.2 IPEndPoint 2 域名解析2.1 IPHostEntry2.2 Dns 3 序列化与反序列化3.1 序列化3.1.1 内置类型 -> 字节数组3.1.2 字符串 -> 字节数组3.1.3 类对象 -> 字节数组 3.2 反序列化3.2.1 字节数组 -> 内置类型3.2.2 字节数组 -> 字…

Java-servlet(七)详细讲解Servlet注解

Java-servlet(七)详细讲解Servlet注解 前言一、注解的基本概念二、Override 注解2.1 作用与优势2.2 示例代码 三、Target 注解3.1 定义与用途3.2 示例代码 四、WebServlet 注解4.1 作用4.2 示例代码 五、反射与注解5.1 反射的概念5.2 注解与反射的结合使…

nginx 反向代理 ubuntu

关键字 Nginx,正向代理,方向代理,博客建站 背景环境 我在搭建个人博客的过程中遇到一个问题,我的博客服务的端口是1313,我的域名是qinyangx.top。我希望能够通过qinyangx.top直接访问到服务器上1313端口的博客服务。…

学习threejs,使用TextGeometry文本几何体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.TextGeometry1.1.1 ☘…

【秣厉科技】LabVIEW工具包——OpenCV 教程(12):机器学习

文章目录 前言机器学习例1:支持向量机(SVM)做平面向量二分类例2: K邻近算法(KNearest)实现分类 总结 前言 需要下载安装OpenCV工具包的朋友,请前往 此处 ;系统要求:Wind…

企业级AI架构探索:业务驱动,场景优先

企业级AI架构的设计需要兼顾技术先进性、业务适配性、成本效益和长期可维护性。以下从架构设计原则、核心架构层次、基础框架可能性、实施路径四个维度进行系统性阐述: 一、设计原则 业务驱动,场景优先 明确AI解决的业务痛点(如降本增效、智…

DCDC36V同步降压 输出可调 2A电流恒压芯片SL1588H 替换LV3842

在当今电子设备飞速发展的时代,电源管理芯片的性能优劣直接关乎设备的稳定性与高效运行。对于诸多需要将 36V 电压进行同步降压、输出电压可调且稳定输出 2A 电流的应用场景,一款卓越的恒压芯片不可或缺。SL1588H 正凭借其领先的技术和出色的性能&#x…

Beans模块之工厂模块注解模块@Qualifier

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

flutter 开发web端的性能优化

参考资料 Flutter for Web 首次首屏优化 ——JS 分片优化_main.dart.js-CSDN博客文章浏览阅读1.4k次。本文介绍了如何通过延迟加载组件和js分片优化Flutter for Web应用的加载速度。在实践中,通过按需加载减少js文件大小,使用并行加载提升加载效率。通过…

【设计模式】三十二、策略模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式定义与核心思想二、模式结构与Java实现1. 核心角色2. Java代码示例 三、策略模式的五大核心优势四、适用场景五、与其他模式的对比六、最佳实践建议总结 🚀进阶版【更…

【Linux 维测专栏 1 -- Hung Task 分析与验证】

文章目录 Linux Hung Task 简介1. Hung Task 概述2. D 状态与 Hung Task3. Hung Task 的工作原理4. Hung Task 的配置5. Hung Task 的典型输出6. Hung Task 的应用场景7. kernel 配置7.1 编译选项7.2 参数控制7.3 验证方法4. 扩展接口 8. 注意事项 Linux Hung Task 简介 1. Hu…

计算机网络精讲day1——计算机网络的性能指标(上)

性能指标1:速率 概念1:比特 英文全称是binary digit,意思是一个二进制数字,因此一个比特就是二进制数字中的1或0,比特也是信息论中使用的信息量单位。 概念2:速率 网络中的速率指的是数据的传送速率&#…

ubuntu20.04使用matlab2024a快捷键调整

一、概述 因为最近在使用ubuntu系统,在上面安装一个matlab比较方便,不用来回在window上面进行跳转,节省不少时间,同时在ubuntu下面启动matlab速度也比较快。 二、问题解决 (一)问题概述 问题如下&#xf…

【设计模式】装饰模式

六、装饰模式 装饰(Decorator) 模式也称为装饰器模式/包装模式,是一种结构型模式。这是一个非常有趣和值得学习的设计模式,该模式展现出了运行时的一种扩展能力,以及比继承更强大和灵活的设计视角和设计能力,甚至在有些场合下&am…

科技赋能安全:慧通测控的安全带全静态性能测试

汽车的广泛普及给人们的出行带来了极大便利,但交通事故频发也成为严重的社会问题。据世界卫生组织统计,全球每年约有 135 万人死于道路交通事故,而安全带在减少事故伤亡方面起着不可替代的作用。正确使用安全带可使前排驾乘人员的死亡风险降低…

猿大师中间件:如何在最新Chrome浏览器Web网页内嵌本地OCX控件?

OCX控件是ActiveX控件的一种,主要用于在网页中嵌入复杂的功能,如图形渲染、多媒体播放等,可是随着谷歌Chrome等主流浏览器升级,目前已经不支持微软调用ActiveX控件了,如果想调用OCX控件用IE浏览器或者国产双擎浏览器&a…