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

目录

前言:

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.mzph.cn/news/698053.shtml

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

相关文章

system V 共享内存

1.共享内存的原理 要理解共享内存的原理,首先我们得记起进程间通信的前提:必须让不同的进程看到同一份资源(必须由OS提供) 我们都知道进程都会有自己的进程地址空间,然后都会通过页表与物理内存进行映射,…

图纸透明加密:保护机械图纸安全的新方法

随着信息技术的不断发展,机械制造行业对于图纸安全的需求越来越高。机械图纸是企业的核心竞争力之一,泄露可能导致严重的商业损失和技术风险。为了解决这一问题,图纸透明加密成为了一种新的保护机械图纸安全的方法。本文将介绍图纸透明加密的…

面试字节跳动,我被怼的好狠,怎一个惨字了得

人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的。 我一听呀?那我这岂不是就不优秀了吗,于是毅然决然和女朋友分了手。 人们都说,互联网寒冬来了,这个时候还在大面积招人…

【LeetCode】343. 整数拆分(中等)——代码随想录算法训练营Day40

题目链接:343. 整数拆分 题目描述 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。…

从零开始手写mmo游戏从框架到爆炸(二十一)— 战斗系统二

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 上一章(从零开始手写mmo游戏从框架到爆炸(二十)— 战斗系统一-CSDN博客)我们只是完成了基本的战斗,速度属性并没有…

R语言数据分析(三)

R语言数据分析(三) 文章目录 R语言数据分析(三)一、可视化步骤1.1 创建ggplot1.2 添加美学和图层1.3 简化代码 二、可视化分布2.1 分类变量2.2 数值变量 三、可视化关系3.1 数值变量和分类变量3.2 两个分类变量3.3 两个数值变量3.…

C++的STL都由什么组成

C标准模板库(STL)是C语言的一部分,提供了一系列模板类和函数,旨在帮助程序员处理常见的编程任务,如数据结构和算法操作。 STL主要包括四大组件: 容器(Containers)、 迭代器&#xff…

虚拟机器centos7无法识别yum 命令异常处理笔记

问题现象 启动虚拟机后执行ipconfig 提示未找到该命令,然后执行yum install -y net-tools提示 curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"的错误 [roothaqdoop~]# ifconfig -bash: ifconfig: 未找到命令 [roothadoop~]# yum install …

以Scala官方提供的方法解读TraversableOnce

代码提供 让我们先来看Scala中提供的一段代码 static List toList$(final TraversableOnce $this) { return $this.toList(); } default List toList() {return (List)this.to(scala.collection.immutable.List..MODULE$.canBuildFrom()); } 上述代码片段是Scala中的两个方…

Android自编译Pixel3内核加入KernelSU

背景 让Pixel3 AOSP Android10 4.9内核用上Kernel SU 环境: Ubuntu 18.04 vm aosp10r2 移植参考官方,和github项目 Commits OnlyTomInSecond/android_kernel_xiaomi_sdm845 (github.com) 这个项目是 LineageOS/android_kernel_xiaomi_sdm845 编译的前提 已经有完整…

超级抽象的前端2

vue3的调用方法失败的原因 function validateConfirm(rule, value, callback) {if (value ! form.password) {callback(new Error(两次输入的密码不一致))} else {callback()}function showAgreement() {dialogVisible.value true}function submitForm() {// 这里是提交表单的…

逆推求期望DP

我的开始的想法:状态设置 dp[i][j] 为玩了 i 个职业 j 个阵营的期望天数,初始值很好解决 dp[1][1]1 ,但是有个问题,每对 (i,j) 除了边界那里,会由三个地方来决定这一个(i-1,j-1)(i,j-1)(i-1,j),所以&#x…

LayUI发送Ajax请求

页面初始化操作 var processData null $(function () {initView();initTable();// test(); })function initView() {layui.use([laydate, form], function () {var laydate layui.laydate;laydate.render({elem: #applyDateTimeRange,type: datetime,range: true});}); }初始…

【spring】 ApplicationListener的使用及原理简析

文章目录 使用示例:原理简析: 前言:ApplicationListener 是spring提供的一个监听器,它可以实现一个简单的发布-订阅功能,用有点外行但最简单通俗的话来解释:监听到主业务在执行到了某个节点之后&#xff0c…

Elasticsearch中可避免的坑

版本定位:7.x 总结的坑: term及terms词条查询时,如果有text及keyword类型,则需加.keywordqueryString全字段搜索时,最好指定字段;并要提前设置好字段mapping:keyword并指定分词器。reindex做数…

【ACM出版】第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)

第五届计算机信息和大数据应用国际学术会议(CIBDA 2024) 2024 5th International Conference on Computer Information and Big Data Applications 重要信息 大会官网:www.ic-cibda.org 大会时间:2024年3月22-24日 大会地点&#…

Atcoder ABC341 A-D题解

比赛链接:ABC341 Problem A: 先签个到。 #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;for(int i0;i<n;i)cout<<"10"<<endl;cout<<"1"<<endl;return 0; } Problem B: 继续签。 #i…

week04day03(爬虫 beautifulsoup4、)

一. 使用bs4解析网页 下载bs4 - pip install beautifulsoup4 使用的时候 import bs4专门用于解析网页的第三方库 在使用bs4的时候往往会依赖另一个库lxml pip install lxml 网页代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><…

【Python笔记-设计模式】对象池模式

一、说明 用于管理对象的生命周期&#xff0c;重用已经创建的对象&#xff0c;从而减少资源消耗和创建对象的开销 (一) 解决问题 主要解决频繁创建和销毁对象所带来的性能开销问题。如数据库连接、线程管理、网络连接等&#xff0c;对象的创建和销毁成本相对较高&#xff0c…

冬眠...

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 阿宁生活在一个 nnn 行 mmm 列的字符矩阵中&#xff0c;阿宁打算在第 xxx 行 yyy 列冬眠。 在每一天&#xff0c;都会有 qqq 次行循环移动或列循环移动。 如果是第 zzz 行循环移动&#xff0c;…