首页 > 编程语言 >8.8程序加载时会生成栈和堆

8.8程序加载时会生成栈和堆

时间:2023-02-07 09:35:53浏览次数:36  
标签:函数 8.8 程序 内存空间 内存 时会 分配 加载

EXE文件的内容分为再配置信息、变量组和函数组,这一点想必大家都清楚了吧。不过,当程序加载到内存后,除此之外还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域(图8-10)。

 

 EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。因而,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。当然,在内存中,加载Windows 等操作系统的内存空间又是另外一回事了。

栈及堆的相似之处在于,他们的内存空间都是在程序运行时得到申请分配的”。不过,在内存的使用方法上,二者存在些许不同。栈中对数据进行存储和舍弃(清理处理)的代码,是由编译器自动生成的,因此不需要程序员的参与。使用栈的数据的内存空间,每当函数被调用时都会得到申请分配,并在函数处理完毕后自动释放。与此相对,堆的内存空间,则要根据程序员编写的程序,来明确进行申请分配或释放。
不管是什么程序,程序的内容都是由处理和数据构成的。大多数编程语都是用函数来表示处理、用变量来表示数据。
栈和堆的大小,可以由程序员任意指定。在高级编程语言中,编译器会自动生成指定栈和堆大小的代码,并将其附加到程序中。
根据编程语言的不同,对堆用的内存空间进行申请分配和释放的程序的编写方法也是多种多样的。C语言中是通过malloc()函数来进行申请分配、通过free()函数来释放的。而C++中则是通过new运算符来申请分配、通过delete运算符来释放的。无论是C语言还是C++,如果没有在程序中明确释放堆的内存空间,那么即使在处理完毕后,该内存空间仍会一直残留。这个现象称为内存泄露(memory leak),它是令C语言及C++的程序员们十分头疼的一个bug(程序的错误)。如果内存泄露一直存在的话,就有可能会造成内存不足而导致宕机。这就好比,如果水龙头一直嘀嗒嘀嗒地漏水,那么一晚上的时间水桶就可能会装满并溢出。

标签:函数,8.8,程序,内存空间,内存,时会,分配,加载
From: https://www.cnblogs.com/2674308160-lucky/p/17097287.html

相关文章

  • IDEA加载项目时提示Windows Defender might be impacting your build performance
    1.点击fix,弹出对话框,选择configureautomatically,选择ok2.出现以下提示表示成功 3.若不成功,可以手动设置防火墙白名单,添加排除项 ......
  • QML中文件的加载(三种方法)
    篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QML中文件的加载(三种方法)相关的知识,希望对你有一定的参考价值。在这里小小总结一下QML文件中如何加载QML文件......
  • QML文件加载的几种方式
    整理下QML过程,看到好多方式加载QML文件,这里参考网上总结整理下.QQmlApplicationEngine加载QML查看帮助文档,可以看出QQmlApplicationEngine继承自QQmlEngine->QObject.......
  • Qt加载qml的方式
    1、QQmlApplicationEngined搭配Window示例:#include<QGuiApplication>#include<QQmlApplicationEngine>intmain(intargc,char*argv[]){QGuiApplication......
  • 更新完opencore0.8.8后多了一个EFI怎么删除
    原文来源于黑果魏叔官网,转载需注明出处。资源下载请搜索:黑果魏叔OpenCore0.8.8添加了.contentVisibility来隐藏引导条目:如果引导加载程序附近或引导目录中有包含禁用内......
  • 面试被问到“类的加载过程”,怎么回答可以脱颖而出?
    大家好,我是哪吒。一、做一个小测试,通过注释,标注出下面两个类中每个方法的执行顺序,并写出studentId的最终值。packagecom.nezha.javase;publicclassPerson1{p......
  • 面试被问到“类的加载过程”,怎么回答可以脱颖而出?
    大家好,我是哪吒。一、做一个小测试,通过注释,标注出下面两个类中每个方法的执行顺序,并写出studentId的最终值。packagecom.nezha.javase;publicclassPerson1{private......
  • JAVA 双亲委派与类加载器
    JAVA双亲委派与类加载器双亲委派虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加......
  • [Oracle19C 数据库管理] 加载和传输数据库
    移动数据的通用架构数据泵datapump(impdp,expdp),借助DBMS_DATAPUMP存储过程,可以进行表的导出导入,行记录的导出导入,表空间的导出导入或者整个schema的导出导入。使用数......
  • 6.7【微信小程序全栈开发课程】记录页面(七)--分页加载记录数据
    现在是一次性加载所有的记录数据,数据多的时候,会加载比较慢,所以我们改成分页加载,一次最多加载15条数据每次拉倒底部都会自动加载下一页的数据,知道所有的数据加载完成1、添加d......