c++内存的四大分区详解

news/发布时间2024/5/14 14:16:37

目录

前言:

1、程序的基本运行流程

2,为啥要分为四个区域?

3,分为哪四个区域?

4,4个区域详解

代码区:

为什么会设置这两个功能呢?

全局区:

栈区:

堆区: 

new:

补充知识:new关键字

总结:


前言:

这篇博客介绍c++四大分区的详解,其中也会涉及到有关new关键字的知识点

对于程序员来说,认识内存的分区是一项基本功能。

1、程序的基本运行流程

首先我们写代码时,代码会存放在硬盘上,然后会被操作系统存放在内存里分好的四个区中,然后开始执行代码

注意:代码从硬盘放到内存中也是由操作系统来工作的

2,为啥要分为四个区域?

由于不同区域放的数据会被赐予不同的生命周期,使操作更灵活,不会导致混淆,也使管理更灵活。

反正总结来说,就是更方便了。

3,分为哪四个区域?

分为代码区、全局区、栈区、堆区。

静态区,代码区,堆区,栈区 存储地址依次下降

而他们在程序运行前和程序运行后又有不同的分类

对于程序运行前,c++内存分为代码区和全局区,而在程序运行后划分的区域就又有栈区和堆区了。

4,4个区域详解

代码区:程序运行前放的区域,编译后生成exe可执行程序,未执行程序前分为两个区域:代码区和全局区

代码区:

存放2进制的机器指令,CPU执行的机器指令,功能为共享只读

为什么会设置这两个功能呢?

因为有些程序会重复执行,所以设置共享的功能,不会造成资源浪费。

只读是为了防止程序意外修改指令

全局区:

存放全局变量和静态变量和常量——const修饰变量和字符串常量,该区域的数据在程序结束后由操作系统释放。

全局变量是指在主程序外面写的变量,局部变量和全局变量都不在一个段里存放

静态变量就是在普通变量前加上static,属于静态变量,

常量-》字符串常量和const修饰的变量,这里const修饰的变量是const修饰的全局变量不包含const修饰的局部变量。

const修饰的全局变量-》可以叫全局常量

const修饰的局部变量-》不放在全局区里

常量的地址都很接近,基本上地址的前几个数字都一样

而同在全局区的全局变量和静态变量,虽然前面地址不一样但是同样挨得很近。

栈区:

由编译器自动分配释放,存放函数的参数值和局部变量等,栈区数据在函数执行完后会自动释放。 从大(地址)到小(地址)存贮
注意事项: 不要返回局部变量的地址why ——因为局部变量存在栈区,栈区数据在函数执行完后自动释放,因此地址无法拿到,不要返回局部变量地址。但是如果写一个程序,发现可以打印啊,为什么?因为编译器会给你做个保留,第二次再次输出时,发现这个数据就不是正常的了,因此最好不要去返回局部地址,

堆区: 

需要自己创建,自己释放,假如程序员不自己释放掉,程序结束时由操作系统回收,注意:在程序运行时,程序不会自己释放这片数据的。

堆:从小(地址)到大(地址);

那么如何把数据开辟到堆区呢?

使用关键字new

new:

可以使用new关键字来让数据开辟到堆区:

new 数据类型(具体的赋值)

例如:new int(1),这样就开辟了一块堆区数据,而返回一个数据类型指针。

那么如何表示这个堆区变量呢?

由指针接受

int*a=new int(1),这样就是创造了一个指针变量a指向内存中堆区开辟的整型数据“1”

编号返回,用指针接收这块内存。

但是这时候会问,那指针不是不在堆区吗,为什么要用一个指针来开辟呢?

因为指针是一个局部变量,放在栈区,如果拿一个整型常量,无法存储堆区的数据。

只要在内存上,都有地址编号,拿一个指针开辟是为了存储堆区的数据  

如何释放堆区数据?

利用delete关键字来释放空间

补充知识:new关键字

适用语法:new  数据类型(初始化数据)这个括号可以不写,相当于不初始化数据

new返回的是该数据类型的指针

在堆区创建,而我们也知道堆区数据由程序员开辟,由程序员释放

释放后就会非法操作,再次访问会出错

那么创建数组呢?

int *a=new int[10],这里的10代表数组有10个元素,后续和正常数组变量一样操作就可以,不过最后需要释放这个delete[] a;

注意这里要加[]告诉程序要释放所有的数组元素。

总结:

内存分为代码区,全局区,堆区,栈区,

而在程序运行之前内存分为代码区和全局区,

在程序运行之后才有栈区和堆区

而堆区的数据需要程序员自己释放自己创建,使用关键字new和delete

感谢观看,欢迎点赞收藏专栏,会分享更多c++的知识,如有错误,欢迎大佬指正(●'◡'●)

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

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

相关文章

vivim复习

vi/vim常用命令 vi&vim常用命令 set nu 显示行号 gg 跳转到文件开头 / 向后搜索 ? 向前搜索 n 查找下一处N 查找上一处 | 光标所在行行首L 屏幕所显示的底行{ 段首} 段尾- 前一行行首 后一行行首 ( 句首 ) 下一句首 $ 行末 M 屏…

网络编程项目:电子辞典

项目要求: 登录注册功能,不能重复登录,重复注册。用户信息也存储在数据库中。单词查询功能历史记录功能,存储单词,意思,以及查询时间,存储在数据库基于TCP,支持多客户端连接&#x…

比特币突然大涨

作者:秦晋 2月9日,除夕夜,比特币突然大涨,最高涨至48219美元,涨幅超6%。据CNBC报道,本周比特币已经上涨10.76%,创下自12月8日以来的最佳的一周。本周ETH上涨8.46%,成为自1月12日以来…

CSS之margin塌陷

margin塌陷 CSS中的外边距塌陷(Margin Collapse)问题是指在垂直方向上,当两个或多个块级元素的边距相遇时,它们之间的距离不是它们各自边距的总和,而是其中的最大值。这种现象主要出现在块级元素的上下外边距之间。 &…

【打工日常】使用docker部署可视化工具docker-ui

一、docker-ui介绍 docker-ui是一个易用且轻量化的Docker管理工具,透过Web界面的操作,方便快捷操作docker容器化工作。 docker-ui拥有易操作化化界面,不须记忆docker指令,仅需下载镜像即可立刻加入完成部署。基于docker的特性&…

算法与数据结构

算法与数据结构 前言 什么是算法和数据结构? 你可能会在一些教材上看到这句话: 程序 算法 数据结构 算法(Algorithm):是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代…

形态学算法应用之连通分量提取的python实现——图像处理

原理 连通分量提取是图像处理和计算机视觉中的一项基本任务,旨在识别图像中所有连通区域,并将它们作为独立对象处理。在二值图像中,连通分量通常指的是所有连接在一起的前景像素集合。这里的“连接”可以根据四连通或八连通的邻接关系来定义…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-事件event

目录 一、事件基本概念二、事件运行机制三、事件开发流程四、事件使用说明五、事件接口坚持就有收获 一、事件基本概念 事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。一个任务可以等…

移动机器人激光SLAM导航(五):Cartographer SLAM 篇

参考 Cartographer 官方文档Cartographer 从入门到精通 1. Cartographer 安装 1.1 前置条件 推荐在刚装好的 Ubuntu 16.04 或 Ubuntu 18.04 上进行编译ROS 安装:ROS学习1:ROS概述与环境搭建 1.2 依赖库安装 资源下载完解压并执行以下指令 https://pa…

【漏洞复现-通达OA】通达OA share存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力,包…

Electron实战之菜单与托盘

菜单、托盘是桌面端应用必备的功能之一,我们通常会在菜单上配置应用常用的:偏好设置、显示隐藏、打开文件等功能,在托盘内设置:退出、重启、帮助等辅助性功能,帮助用户方便快捷地控制应用的一些系统功能。系统托盘实际…

js设计模式:工厂模式

作用: 可以通过new关键字,批量的创建对象。 将对象的创建和具体业务逻辑进行分离,代码清晰可维护。 示例: function workFactory(workName,name){switch(workName){case jsCoder:return new jsCoder(name)breakcase javaCoder:return new javaCoder(name)break …

【网络安全 | 网络协议】一文讲清HTTP协议

HTTP概念简述 HTTP(Hypertext Transfer Protocol)协议,又称超文本传输协议,用于传输文本、图像、音频、视频以及其他多媒体文件。它是Web应用程序通信的基础,通过HTTP协议,Web浏览器可以向Web服务器发起请…

【Spring MVC篇】返回响应

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、返回静态页面…

用户空间与内核通信(一)

在Linux中,内核空间与用户空间是操作系统中的两个主要部分,它们有着明显的区别和不同的功能。 内核空间: 内核空间是操作系统内核运行的区域,它包括了操作系统内核代码、数据结构和设备驱动程序等。内核空间位于虚拟地址空间的最…

怎么用postman调用webservice(反推SoapUI)

<soapenv:Envelope xmlns:soapenv“http://schemas.xmlsoap.org/soap/envelope/” xmlns:lis“LisDataTrasen”> soapenv:Header/ soapenv:Body lis:Test lis:test111111111</lis:test> </lis:Test> </soapenv:Body> </soapenv:Envelope> Conten…

使用 Windows 11/10 上的最佳 PDF 转 Word 转换器释放 PDF 的潜力

毫无疑问&#xff0c;PDF 是最好的文档格式之一&#xff0c;但就像其他格式一样&#xff0c;有时它们确实会带来一些限制。例如&#xff0c;在某些情况下&#xff0c;您可能想要将 PDF 转换为 Word。在这种情况下&#xff0c;您始终可以借助 PDF 到 Word 转换器的帮助。 为了说…

迈向AI时代:掌握Python编程与ChatGPT的强强联手

文章目录 一、ChatGPT与Python编程的结合二、利用ChatGPT学习Python编程的优势三、如何使用ChatGPT学习Python编程四、学习技巧与建议《码上行动&#xff1a;用ChatGPT学会Python编程》特色内容简介作者简介目录获取方式 随着人工智能技术的飞速发展&#xff0c;编程已经成为了…

Spring Security基础学习

一、SpringSecurity框架简介 二、SpringSecurity入门案例 三、SpringSecurity Web权限方案 四、SpringSecurity微服务权限方案 五、SpringSecurity原理总结

【后端高频面试题--设计模式上篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 往期精彩内容 【后端高频面试题–设计模式上篇】 【后端高频面试题–设计模式下篇】 【后端高频…
推荐文章