5.【CPP】内存管理(text段data段bss段||nwedelete底层实现||源码)

一.内存管理

1.如图

在这里插入图片描述

2.heap下面的空间

在这里插入图片描述

应用程序加载到内存中由操作系统完成对bss,data,text,stack加载,并在内存分配空间。在编译阶段已经确定分配了多少空间,属于静态分配。
而malloc等在程序运行时在堆上开辟空间则属于动态分配,需要手动free掉开辟的空间,否则会造成内存泄漏。

text(代码段):用来存放程序执行代码的内存区域。在内存中被映射为只读,通常存一些只读的数据,如字符串常量。
data(数据段):通常用来存放程序中已初始化的(非 0)全局变量和静态局部变量。数据段的起始位置由链接定位文件确认,大小在编译链接时自动分配
bss 是英文 Block by Symbol 的简称。通常用来存放程序中未初始化和初始化为 0的全局变量的一块内存区域.
text 和 data 段都在可执行文件中,由系统从可执行文件中加载;而 bss 段不在可执行文件中,由系统初始化。那么就意味着一个很大的变量如果不初始化,那么编译后生成的文件要比初始化的小

3.验证一下

在这里插入图片描述
在这里插入图片描述
我们可以看到初始化后的test1编译后文件大小明显大于未初始化的test的文件大小,说明结论成立。

二.new 和delete

1.使用

int* p1=new int(10);//初始化一个int,值是10
int* p2=new int[10];//初始化一个int数组,大小为10,调用十次operator new//c++11支持花括号初始化
int* p3=new int[10]{1,2,3,4,5} ;delete p1;
delete [] p2;//要加括号析构十次,否则会报错
delete [] p3;

2.底层实现

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,
尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/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 == NULLreturn;_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)

1.new和delete是操作符,实际调用了全局函数operator new和operator delete,底层也是通过malloc和free实现的。
2.相较于malloc/free,new和delete在堆上开空间的同时还调用了自定义类型的构造和析构函数,若空间开辟失败会抛异常(malloc会返回空指针)。
3.new 和delete要配套使用。

以上就是文章的全部内容,点赞支持!!!

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

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

相关文章

k8s---配置资源管理

内容预知 目录 内容预知 secret资源配置 secert的几种模式 pod如何来引用secret 陈述式创建secret 声明式base64编码配置secret 将secret用vlumes的方式挂载到pod中 传参的方式将环境变量导入pod 如何通过secret加密方式获取仓库密码 configmap的资源配置 陈述式创建…

ubuntu 22 搭建git服务

第一步,安装git: sudo apt-get install git 创建用户信息 git config --global user.name soft 第二步,创建一个git用户,用来运行git服务: sudo adduser git 创建git仓库的存储目录、更改文件目录属主为代码仓库…

2.3数据链路层02

2.3 数据链路层 2.3.5 以太网 1、以太网概念 以太网是一种计算机局域网技术。IEEE(电气与电子工程师协会:Institute of Electrical and Electronics Engineers)组织的IEEE802.3标准制定了以太网的技术标准,它规定了包括物理层的…

Gartner发布CPS安全2024年预测:安全形势动荡的四大向量

随着威胁形势、自动化和人工智能采用的步伐以及供应商形势不断快速发展,我们为安全和风险管理领导者提供了四项预测,以规划 2024 年及以后 CPS 安全的未来发展方向。 主要发现 随着人工智能的采用加速增加网络物理系统( CPS)的“智…

MPLS基础架构

目录 一、MPLS多协议标签交换概述 1、MPLS是什么 2、MPLS-VPN 3、MPLS起源 (1)、MPLS解决的问题 MPLS解决了三层转发短板问题。 (2)、交换机转发流程 (3)、路由器转发流程 (4)、交换…

【程序员的自我修养11】栈与函数调用过程

绪论 大家好,欢迎来到【程序员的自我修养】专栏。正如其专栏名,本专栏主要分享学习《程序员的自我修养——链接、装载与库》的知识点以及结合自己的工作经验以及思考。编译原理相关知识本身就比较有难度,我会尽自己最大的努力,争…

gradle版本中-bin与-all区别

打开android studio下载的gradle文件,发现-all比-bin多了一个docs文件夹和一个src文件夹。-bin是编译后的二进制发布版,-all还包含了源码和文档,比-bin大了几十兆,两者其余没有区别。 android开发只关注gradle功能不关注实现的情况…

基于K-Means聚类与RFM模型分析顾客消费情况【500010102】

项目说明 本数据集是生成式模拟数据,本项目通过可视化分析对数据进行初步探索,再通过时间序列针对店铺的销售额进行分析,对时序图进行分解,发现数据存在季节性,并且通过auto_arima自动选择参数建立了SARIMA模型&#…

IOS-高德地图路径绘制-Swift

本文展示的是在IOS开发中调用高德地图进行驾车路径绘制,开发语言是Swift。 IOS高德地图集成请看:IOS集成高德地图Api 使用路径规划功能需要集成高德地图的搜索功能。 pod AMapSearch定义AMapSearchAPI 定义主搜索对象 AMapSearchAPI ,并继承…

AI对决:ChatGPT与文心一言的深度比较

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文…

Linux下的HTTP代理服务器Squid的配置和使用

Squid是一个流行的Linux下的HTTP代理服务器软件。通过Squid,你可以在Linux服务器上设置一个代理服务器,以便为客户端提供安全的网络连接和数据传输。以下是Squid的配置和使用指南。 1. 安装Squid 首先,你需要确保你的Linux系统上已经安装了…

国标GB28181安防视频监控平台EasyCVR视频分享页增加精简模式

智慧安防平台EasyCVR能在复杂的网络环境中(专网、局域网、广域网、VPN、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理,平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷传输,可以兼容各品牌的IPC、NVR、移动…

寒假学习打字:提前实现弯道超车

寒假对于学生来说,通常是一个宝贵的时间段,可以用来放松、充实自己,或者提高一项重要的技能——打字。在这个数字时代,打字技能变得比以往任何时候都更加重要。无论是在学校的论文写作,还是在工作中处理电子邮件&#…

低代码高逻辑谱写IT组织和个人的第二成长曲线 | 专访西门子Mendix中国区总经理王炯

在今天快速演进的数字化转型浪潮中,低代码平台已经成为推动企业敏捷适应市场变化的关键引擎。在此背景下,西门子Mendix作为市场上的领导者,以其创新的低代码解决方案不断地刷新着行业标准。 近日,LowCode低码时代访谈了西门子Men…

C#上位机与欧姆龙PLC的通信12----【再爆肝】上位机应用开发(WPF版)

1、先上图 继上节完成winform版的应用后,今天再爆肝wpf版的,看看看。 可以看到,wpf的确实还是漂亮很多,现在人都喜欢漂亮的,颜值高的,现在是看脸时代,作为软件来说,是交给用户使用的…

【JavaEE】CAS

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…

μ综合设计控制器

μ综合设计控制器是一种基于μ分析的控制器设计方法,用于提高控制器的鲁棒性和性能。μ分析是一种数学工具,用于描述和比较控制系统在不同参数变化下的性能。通过μ综合设计,可以综合运用各种控制策略,以达到更好的控制效果。 μ…

【双指针】001移动零_C++

题目链接:移动零 目录 题目解析 代码书写 知识补充 题目解析 题目让我们求必须在不复制数组的情况下,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 这题我们可以用双指针的方法来写: 我们这里将用两个数组下标来…

条码WMS仓储管理系统的价值与优势

在全球化和数字化的时代,企业面临着诸多挑战。在复杂的运营环境中,如何提高运营效率和效果,降低成本,增强竞争力,成为企业关注的焦点。而库存管理作为企业运营的关键环节,其重要性不言而喻。本文将深入探讨…

北交所交易手续费标准?哪家证券公司开通北交所券商交易手续费佣金万2?

北交所(Beijing Exchange)是指位于中国北京的一家金融交易所。北交所是中国政府为推动金融改革和国际化市场而设立的交易场所。它提供包括股票、债券、期货、外汇等多种金融产品的交易服务。北交所的目标是促进中国金融市场的发展,吸引国内外…