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

这篇具有很好参考价值的文章主要介绍了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++的知识,如有错误,欢迎大佬指正(●'◡'●)文章来源地址https://www.toymoban.com/news/detail-828105.html

到了这里,关于c++内存的四大分区详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】memcpy memmove memset memcmp 四大内存操作函数(详解+用法+模拟实现)

    头文件string.h中常用内存操作函数共有四大,学习完本篇文章,各种类型数组的常见处理轻松拿下。 对字符串(字符数组)的操作函数有很多,但是我们想要操作整型数组等呢: 这就需要内存操作函数了, memory在计算机科学中是内存的意思 ,这也是四大内存操作函数都有mem头

    2024年02月10日
    浏览(36)
  • 第八十五天学习记录:C++核心:内存分区模型

    C++程序在执行时,将内存大方向划分为4个区域 1、代码区:存放函数体的二进制代码,由操作系统进行管理 2、全局区:存放全局变量和静态变量以及常量 3、栈区:由编译器自动分配释放,存放函数的参数值,局部变量等 4、堆区:由程序员分配和释放,若程序员不释放,程

    2024年02月12日
    浏览(35)
  • C++核心编程——内存分区、引用、函数提高和函数重载

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ==== 第3阶段-C++核心编程 , --------

    2024年01月22日
    浏览(26)
  • C语言内存操控的艺术探索:踏足四大秘境,铸就内存管理之巅峰传奇

    欢迎来到白刘的领域    Miracle_86.-CSDN博客 系列专栏    C语言知识 先赞后看,已成习惯    创作不易,多多支持! 在C语言的内存管理领域,四大秘境之一的内存操作函数无疑为程序员提供了强大的工具。这些函数——memcpy、memmove、memset、memcmp——各自拥有独特的用途和特性

    2024年04月16日
    浏览(35)
  • (C++) 详解内存地址空间

    0. 概述 一个C/C++ 程序,编译之后,形成的程序,在执行期间,内存中不仅存在一块区域用于存放代码,还有一些其他的区域用于使用,本节会详解C/C++内部所使用的内存地址空间,关于各内存的作用、位置做一个整体概述。 1. C++ 内存布局 操作系统的内存布局可大致分为两块

    2024年02月22日
    浏览(27)
  • C++中的内存空间管理详解【C++】

    如图代码中变量在内存中的存储位置。 内存分布图: 1. 栈又叫做堆栈,存储非静态局部变量/函数参数/返回值等等,栈是向下增长的。 栈是向下增长的,而堆是向上增长的? 一般来说,在栈上开辟空间,先开辟的空间地址较高,而在堆开辟空间,先开辟的空间地址较低。

    2024年02月07日
    浏览(27)
  • C++六种内存序详解

    要理解C++的六种内存序,我们首先须要明白一点,处理器读取一个数据时,可能从内存中读取,也可能从缓存中读取,还可能从寄存器读取。对于一个写操作,要考虑这个操作的结果传播到其他处理器的速度。 并且,编译器的指令重排和CPU处理器的乱序执行也是我们需要考虑

    2024年04月22日
    浏览(21)
  • 【c++中内存拷贝函数(C++ memcpy)详解】

    原型 :void*memcpy(void*dest, const void*src,unsigned int count);  功能 :由src所指内存区域复制count个字节到dest所指内存区域。   说明 :src和dest所指内存区域不能重叠,函数返回指向dest的指针。     举例 :  下面自行实现这个函数 程序清单 1 V0.1版程序  程序清单 2 测试V0.1用例   

    2023年04月20日
    浏览(24)
  • C++内存管理(2)new、delete详解

    目录 new operator(new操作) new类对象时加不加括号的差别 new工作任务 delete工作任务 new和delete 堆区空间操作(对比malloc和free) new和delete操作基本类型的空间 new和delete操作基本类型的数组 new和delete操作类的空间 new和delete操作对象数组 new内存分配细节探秘 为什么要尽可能少的

    2024年02月09日
    浏览(36)
  • JVM学习 GC垃圾回收机制 (堆内存结构、GC分类、四大垃圾回收算法)

    🤖 作者简介: 努力的clz ,一个努力编程的菜鸟 🐣🐤🐥   👀 文章专栏: 《JVM 学习笔记》 ,本专栏会专门记录博主在学习 JVM 中学习的知识点,以及遇到的问题。   🙉 文章详情: 本篇博客是学习 【狂神说Java】JVM快速入门篇 的学习笔记,关于 GC垃圾回收机制 (堆内存结

    2023年04月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包