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

Day 9 C++ 内存分区模型

目录

内存四区

代码区

全局区

栈区

堆区

内存四区意义:

程序运行前后内存变化

程序运行前

代码区

全局区

 程序运行后

栈区

堆区

new操作符

基本语法

创建

释放(delete)


内存四区

代码区

代码区(Code Segment):存放程序的机器指令,包括函数体的二进制代码。这部分内存由操作系统进行管理,是只读的,不允许修改。

全局区

全局区(Global/Data Segment):存放全局变量、(static)静态变量以及(const)常量数据。全局变量和静态变量在程序运行期间始终存在,而常量数据则通常存储常量字符串等不可修改的数据。这部分内存在程序启动时分配,在程序结束时释放。

栈区

栈区(Stack):用于存储函数的参数值、局部变量以及函数调用时的上下文信息,由编译器自动分配和释放,具有后进先出(LIFO)的特点。在函数调用时,会为每个函数帧(函数调用的上下文)分配一段栈空间,函数返回后会自动释放该空间。

堆区

堆区(Heap):用于动态分配内存,程序员可以通过手动管理来申请和释放堆内存。堆区的内存分配和释放不受函数调用的限制,需要程序员显式地使用newdeletemallocfree等操作符来进行内存的分配和释放,若程序员不释放,程序结束时由操作系统回收。堆区的内存空间是不连续的,大小相对较大。

内存四区意义:

不同区域存放的数据,被赋予了不同的生命周期, 让我们可以更灵活地编程

(帮助我们合理管理内存资源,提高程序的性能和可维护性)

 

程序运行前后内存变化

程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为全局区和代码区两个区域

代码区

存放 CPU 执行的机器指令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区

全局变量和静态变量存放在此.(全局变量、static 静态变量)

全局区还包含了常量区, 字符串常量和其他常量也存放在此. (const 常量等)

该区域的数据在程序结束后由操作系统释放

 程序运行后

多了堆区和栈区,栈和堆是在程序运行时动态创建的。在程序运行时,根据需要会动态地为局部变量、函数调用等分配栈空间,而堆则用于动态分配内存。

栈区

栈区是由编译器自动分配和释放的,用于存储函数的参数值、局部变量等数据。栈的分配和释放遵循后进先出的原则(LIFO)。当程序执行到一个函数时,该函数的参数会被压入栈中,并在函数执行完毕后自动释放。同样,函数内部的局部变量也会在函数执行完毕后被自动销毁。

注意:在栈区分配的数据不应返回其地址,因为一旦函数执行结束,栈上的数据将被清除,这意味着返回局部变量的地址可能会导致访问已经释放的内存,引发未定义的行为。为了避免这种情况,应始终返回指向堆上动态分配的内存的地址,或是返回全局变量的地址。

堆区

堆区是由程序员手动分配和释放的,需要注意的是如果程序员没有及时释放堆区的内存,那么在程序结束时,操作系统会回收这些内存。

一般使用new关键字来在堆区动态地分配内存,通过new分配的内存将在堆区中创建,并返回该内存的地址。我们可以使用指针来保存这个地址,并在适当的时候使用delete关键字释放对应的内存。需要注意的是,在使用堆区的内存时,要确保正确分配和释放内存,否则可能会导致内存泄漏或者因释放已释放内存而产生悬空指针。

new操作符

new 是C++中用于动态分配内存的操作符。它可以用来在堆区(也称为自由存储区)上创建对象或数组。(程序员手动开辟,手动或者程序结束时自动释放,释放内存利用操作符 delete

基本语法

new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

创建

//动态创建单个对象:Type* pointer = new Type;//Type* pointer = new Type(a);//动态创建数组:Type* array = new Type[size]{a,b,c};//Type* array = new Type[size];

释放(delete)

//释放对象delete pointer;//释放数组delete[] array;

相关文章:

Day 9 C++ 内存分区模型

目录 内存四区 代码区 全局区 栈区 堆区 内存四区意义: 程序运行前后内存变化 程序运行前 代码区 全局区 程序运行后 栈区 堆区 new操作符 基本语法 创建 释放(delete) 内存四区 代码区 代码区(Code Segment&…...

STM32 CubeMX 定时器(普通模式和PWM模式)

STM32 CubeMX STM32 CubeMX 定时器(普通模式和PWM模式) STM32 CubeMXSTM32 CubeMX 普通模式一、STM32 CubeMX 设置二、代码部分STM32 CubeMX PWM模式一、STM32 CubeMX 设置二、代码部分总结 STM32 CubeMX 普通模式 一、STM32 CubeMX 设置 二、代码部分 …...

mysql清除主从复制关系

mysql清除主从复制关系 mysql主从复制中,需要将主从复制关系清除,需要取消其从库角色。这可通过执行RESET SLAVE ALL清除从库的同步复制信息、包括连接信息和二进制文件名、位置。从库上执行这个命令后,使用show slave status将不会有输出。reset slave是各版本Mysql都有的功…...

Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)

文章目录 EurekaEureka组件可以实现哪些功能什么是CAP原则?服务注册代码实战搭建注册中心服务A搭建服务B搭建启动服务启动注册中心启动服务A启动服务B 结束语 Eureka 这篇文章先讲述一下Eureka的应用场景、代码实现案例,多个服务模块注册到Euraka中&…...

【docker】docker部署nginx

目录 一、步骤二、示例 一、步骤 1.搜索nginx镜像 2.拉取nginx镜像 3.创建容器 4.测试nginx 二、示例 1.搜索nginx镜像 docker search nginx2.拉取nginx镜像 docker pull nginx3.创建容器,设置端口映射、目录映射 # 在root目录下创建nginx目录用于存储nginx数据…...

苍穹外卖-day08

苍穹外卖-day08 本项目学自黑马程序员的《苍穹外卖》项目,是瑞吉外卖的Plus版本 功能更多,更加丰富。 结合资料,和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频:https://www.bilibili.com/video/BV1TP411v7v6/?sp…...

【matlab】机器人工具箱快速上手-动力学仿真(代码直接复制可用)

动力学代码,按需修改参数 各关节力矩-关节变量的关系曲线: %%%%%%%%SCARA机器人仿真模型 l[0.457 0.325]; L(1) Link(d,0,a,l(1),alpha,0,standard,qlim,[-130 130]*pi/180);%连杆1 L(2)Link(d,0,a,l(2),alpha,pi,standard,qlim,[-145 145]*pi/180);%连…...

MySQL高级篇第2章(MySQL的数据目录)

文章目录 1、MySQL8的主要目录结构1.1 数据库文件的存放路径1.2 相关命令目录1.3 配置文件目录 2、数据库和文件系统的关系2.1 查看默认数据库2.2 数据库在文件系统中的表示2.3 表在文件系统中的表示2.3.1 InnoDB存储引擎模式2.3.2 MyISAM存储引擎模式 2.4 小结 1、MySQL8的主要…...

【通过改变压缩视频的分辨率实现高效的视频语义分割】CVPR2022论文精度

Efficient Semantic Segmentation by Altering Resolutions for Compressed Videos Efficient Semantic Segmentation by Altering Resolutions for Compressed VideosBasic Information:论文简要 :背景信息:a. 理论背景:b. 技术路线: 结果:a. 详细的实验设置:b. 详细的实验结果…...

golang 时间工具类

用不习惯也嫌麻烦每次都去操作时间,然后就自己写了个时间工具类 package timeutilimport ("time" )func New() *TimeUtil {return &TimeUtil{} }// TimeUtil 是时间操作工具类 type TimeUtil struct{}// GetFormattedDate 获取格式化的日期字符串 fun…...

剑指 Offer 44.!! 数字序列中某一位的数字

参考资料 剑指 Offer 44. 数字序列中某一位的数字 中等 351 相关企业 数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。…...

16K个大语言模型的进化树;81个在线可玩的AI游戏;AI提示工程的终极指南;音频Transformers课程 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 LLM 进化树升级版!清晰展示 15821 个大语言模型的关系 这张进化图来自于论文 「On the Origin of LLMs: An Evolutionary …...

Docker Compose 容器编排 + Docker--harbor私有仓库部署与管理

目录 一、Docker Compose简介 1、Docker Compose 的YAML 文件格式及编写注意事项 2、Docker compose 使用的三个步骤 3、 Docker Compose配置常用字段 4、 Docker Compose 常用命令 5、 Docker Compose 文件结构 二: Docker Compose 安装 1、Docker Compose…...

九五从零开始的运维之路(其二十六)

文章目录 前言一、概述1.什么是数据库2.数据库能干什么(一)企业应用(二)金融行业(三)电子商务(四)社交媒体(五)物联网 3.为什么要用数据库,优势、…...

29.Git版本控制工具

1.Git简介 Git是一开源的分布式版本控制系统,提供了存储代码、管理版本历史、分支和合并等功能。 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。它的主要目的是跟踪和记录软件开发过程…...

【算法题】2790. 长度递增组的最大数目

题目: 给你一个下标从 0 开始、长度为 n 的数组 usageLimits 。 你的任务是使用从 0 到 n - 1 的数字创建若干组,并确保每个数字 i 在 所有组 中使用的次数总共不超过 usageLimits[i] 次。此外,还必须满足以下条件: 每个组必须…...

Qt设置开机自启动无法读取配置文件

问题: Qt5.9.4再注册表中加入开机自启动后,每次开机可以启动,但是无法读取配置文件 解决方案 再main()方法中加入QDir::setCurrent(QCoreApplication::applicationDirPath());即可。 static void AutoRunWithSystem(bool bAutoRun) {// 获取…...

解决Font family [‘sans-serif’] not found问题

序言 以下测试环境都是在 anaconda3 虚拟环境下执行。 激活虚拟环境 conda activate test_python_env 或 source activate test_python_env工具: WinSCP Visual Studio Code 这里笔者使用 WinSCP 工具连接,编辑工具是 Visual Studio Code 一、字体…...

C语言进阶-2

1、多文件C语言项目 1.1、简单的C语言程序(项目) 只有一个C文件(a.c),编译的时候gcc a.c -o a,执行的时候./a 1.2、复杂的C语言程序(项目) 是由多个C文件构成的。例如一个项目中包含2个c文件(…...

Zabbix监控之分布式部署

文章目录 Zabbix监控之分布式部署zabbix proxy概述部署zabbix-proxy节点规划基础环境准备安装proxy以及数据库配置数据库添加服务端host解析修改zabbix-proxy配置文件启动代理服务器 zabbix页面(1)在zabbix页面添加代理(2)zabbix-agent连接proxy Zabbix监控之分布式部署 zabbi…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Java入门学习详细版(一)

大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...