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)的“智…

openssl3.2 - 官方demo学习 - cms - cms_comp.c

文章目录 openssl3.2 - 官方demo学习 - cms - cms_comp.c概述笔记END openssl3.2 - 官方demo学习 - cms - cms_comp.c 概述 CMS is Cryptographic Message Syntax (CMS) standard 用CMS操作, 将明文压缩 默认编译出来的openssl3.2没有zlib库, 需要添加zlib特性[openssl3.2 - …

JAVA基础---内部类详解

文章目录 1. 内部类概念2. 内部类的分类2.1 内部类2.1.1 实例内部类2.1.2 静态内部类2.2 局部内部类2.3 匿名内部类 1. 内部类概念 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务&#xff0c…

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功能不关注实现的情况…

android studio报错:Connect to maven.google.com:443 [mavaen.google.com/

报错很干脆,办法也很干脆。 直接替换 将【https://maven.google.com】替换 为:【http://maven.aliyun.com/nexus/content/groups/public】 或者替换 为:【https://dl.google.com/dl/android/maven2/】

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

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

coco标签处理

抽取coco格式训练集中的一部分作为子训练集,用快速测试算法 from pycocotools.coco import COCO import random import copy import json# 原始的 COCO 标注文件路径 original_annotations_path /workspace/datasets/soccer6/yolo/annotations/train.json# 新的 C…

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的确实还是漂亮很多,现在人都喜欢漂亮的,颜值高的,现在是看脸时代,作为软件来说,是交给用户使用的…

探索JavaScript中强大的三元运算符:简洁、灵活、提升代码效率

探索JavaScript中强大的三元运算符:简洁、灵活、提升代码效率 三元运算是一种在编程中常见的条件表达式。它使用三个操作数进行条件判断,并返回两个值中的一个,具体取决于条件的真假。 三元运算符的优势:相比于使用传统的 if-els…