Day 9 C++ 内存分区模型

这篇具有很好参考价值的文章主要介绍了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创建的数据,会返回该数据对应的类型的指针文章来源地址https://www.toymoban.com/news/detail-609681.html

创建

//动态创建单个对象:

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++ 内存分区模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

    目录 前言: 1、程序的基本运行流程 2,为啥要分为四个区域? 3,分为哪四个区域? 4,4个区域详解 代码区: 为什么会设置这两个功能呢? 全局区: 栈区: 堆区:  new: 补充知识:new 总结: 这篇博客介绍 c++四大分区 的详解,其中也会涉及到有关 new 的知识

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

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

    2024年01月22日
    浏览(33)
  • IsolarAB导出arxml到Matlab/Simulink生成模型并配置内存分区

    本文以一个简单的示例说明如何通过Isolar设计的SWC arxml导入到simulink中生成模型,并指定simulink生成的代码带内存分区信息。本文创建的SWC叫做ECAS_Sensor_SWC, 主要作用是对传感器信号进行处理和传递给后级SWC使用。 对IsolarAB AUTOSAR_Platform/BaseTypes(定义位于PlatformBase_Types.arxml)下面

    2024年04月09日
    浏览(47)
  • day42:C++ day2,C++对C的补充(引用、动态内存分配与回收、函数扩充以及结构体扩充)

    面试题小结: 1、指针与引用的区别? (1)指针指向的是变量的地址,而引用是指向变量本身; (2)指针可以有多级指针,而引用只有一级引用; (3)指针可以不初始化,但是引用必须初始化; (4)指针可以改变指向,但是引用初始化后就不能更改对象; (5)指针用

    2024年02月09日
    浏览(43)
  • 【C++奇遇记】内存模型

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 🐤本篇文章将讲授C++的内存模型相关的知识

    2024年02月11日
    浏览(35)
  • C++奇迹之旅:探索类对象模型内存的存储猜想

    上回我们学习了类的定义,初步了解了什么是类?类的定义,以及类的三个访问限定符: public , private , protected ,本小节将讲解类的实例化,类对象模型的猜想存储,及三种简单类的计算。 在 C++ 中,类的实例化是指创建一个类的对象。当我们定义了一个类之后,就可以根据

    2024年04月12日
    浏览(38)
  • 数据结构:动态内存分配+内存分区+宏+结构体

    1.定义一个学生结构体,包含结构体成员:身高,姓名,成绩;定义一个结构体数组有7个成员,要求终端输入结构体成员的值,根据学生成绩,进行冒泡排序。 1.申请一个10个int类型的堆区空间,并实现选择排序(需要导入头文件 #include stdlib.h) 2.用##拼接带参宏的参数 3.宏函

    2024年02月20日
    浏览(44)
  • 【JVM】内存分区

    程序在执行之前先要把java代码转换成字节码(class文件). JVM 首先需要把字节码通过类加载器(ClassLoader) 把文件加载到内存中 运行时数据区(Runtime Data Area) . 而字节码文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引

    2024年02月07日
    浏览(51)
  • 内存动态分区分配算法

    所谓动态分区分配,就是指 内存在初始时不会划分区域,而是会在进程装入时,根据所要装入的进程大小动态地对内存空间进行划分,以提高内存空间利用率,降低碎片的大小 动态分区分配算法有以下四种: 1. 首次适应算法(First Fit) 空闲分区以 地址递增的次序链接 。分

    2024年02月11日
    浏览(50)
  • 内存的五大分区

    一个由C/C++编译的程序占用的内存分为以下几个部分:栈区,堆区,全局区(静态区),文字常量区,代码区 在执行一个C/C++ 程序时,此程序拥有唯一的“内存四区”(栈区,堆区,全局区,代码区) 一个可执行程序在存储(没有调入内存时)分为代码区,静态区,文字常量

    2024年02月13日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包