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

【注1】局部变量是指只在调用函数时存在于内存中的变量。例如,在代码清单8-1中,WinMain函数的处理中的ave和buff都是局部变量。全局变量是指程序运行时一直存在于内存中的变量。代码清单8-1中的title就是全局变量。

图:加载到内存的程序由4部分构成

① 不管是什么程序,程序的内容都是由处理和数据构成的。大多数编程语言都是用函数来表示处理、用变量来表示数据。

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

栈及堆的相似之处在于,他们的内存空间都是在程序运行时得到申请分配的【注2】。不过,在内存的使用方法上,二者存在些许不同。栈中对数据进行存储和舍弃(清理处理)的代码,是由编译器自动生成的,因此不需要程序员的参与。使用栈的数据的内存空间,每当函数被调用时都会得到申请分配,并在函数处理完毕后自动释放。与此相对,堆的内存空间,则要根据程序员编写的程序,来明确进行申请分配或释放。

【注2】栈和堆的大小,可以由程序员任意指定。在高级编程语言中,编译器会自动生成指定栈和堆大小的代码,并将其附加到程序中。

根据编程语言的不同,对堆用的内存空间进行申请分配和释放的程序的编写方法也是多种多样的。C语言中是通过malloc()函数来进行申请分配、通过free()函数来释放的。而C++中则是通过new运算符来申请分配、通过delete运算符来释放的。无论是C语言还是C++,如果没有在程序中明确释放堆的内存空间,那么即使在处理完毕后,该内存空间仍会一直残留。这个现象称为内存泄露(memory leak),它是令C语言及C++的程序员们十分头疼的一个bug(程序的错误)。如果内存泄露一直存在的话,就有可能会造成内存不足而导致宕机。这就好比,如果水龙头一直嘀嗒嘀嗒地漏水,那么一晚上的时间水桶就可能会装满并溢出。

windows系统-程序加载时生成栈和堆的过程相关推荐

  1. 正在载入java_如何实现程序加载时弹出正在加载对话框

    我们做的很多应用程序,很多功能都需要较长的加载时间,比如下载功能,转换页面等等.在程序进行后台处理的时候,前台的ui是没有反应的.如果在这段时间内我们不作任何处理就让程序停在那的话.第一,用户体验会很 ...

  2. 让Windows系统自动加载SATA驱动程序(转)

    以前在安装Windows的时候老是要借软驱插软盘,遇到软驱软盘坏了就麻烦了,一直都想把驱动做到光盘或者硬盘上并让Windows安装程序自动加载,经过查资料和摸索,得出下面的方法: 安装Windows ...

  3. 让Windows系统自动加载SATA驱动程序

    以前在安装Windows的时候老是要借软驱插软盘,遇到软驱软盘坏了就麻烦了,一直都想把驱动做到光盘或者硬盘上并让Windows安装程序自动加载,经过查资料和摸索,得出下面的方法: 安装Windows ...

  4. C#使用VS 2010在程序加载时创建Access数据库和表

    最近在用C#做一个时间管理系统,需要用到数据库.但由于之前都没有接触过C#,以至于走了很多弯路,所以做完之后顺便在这里记录一下.一来可以使自己养成写文档的习惯,二来也可以帮助到后面学习C#的朋友,可谓 ...

  5. windows下应用程序加载DLL动态链接库路径

    windows下应用程序加载动态链接库路径依次分别是: 举例D盘soft文件夹下存在了一个test.exe的执行文件,即d:\soft\test.exe,依赖test.dll动态链接库. ■程序的执行 ...

  6. oracle 找不到程序单元,Oracle Web ADI 加载时错误:ORA-06508: PL/SQL: 无法在调用之前找到程序单元...

    Oracle EBS 的Web ADI给批量导入数据提供一个不错的解决方案.但是,Web ADI开发比较麻,主要缺点如: 1.集成器设置好以后不能修改,必须要事先考虑包的存储过程或函数的参数.则否,存 ...

  7. linux加载u盘乱码怎么转换,Linux系统下加载U盘设备时文件乱码的有效解决方法

    很少情况会在Linux系统下使用U盘,但是最近有朋友在Linux系统下加载U盘设备的时候发现U盘内的文件出现了乱码现象,这该怎么办呢?很多朋友对Linux系统又不太熟悉,不知道该怎么操作,没关系,让小 ...

  8. 【小程序】图片加载时出现拉扯感,抖动感。

    现象 当我们在写入图片标签时,为了方便喜欢在wxml里面写入css样式,比如以下 <view><image src='/images/BILIBILI_LOGO.png' mode= ...

  9. 【读书笔记】【WebKit技术内 幕(二)】Chromium Webkit资源加载与网络栈、DOM树、HTML解释器、影子DOM、CSS解释器和样式布局、网页层次与渲染、绘图上下文、

    文章目录 前言 Something great 第4章 资源加载和网络栈 Webkit 资源加载 Chromium多进程资源加载 Chromium 网络栈 第5章 HTML解释器和DOM模型 DOM模 ...

最新文章

  1. HttpApplication事件ASP.NET页面周期
  2. Resilience4j-轻量级熔断框架
  3. 10 行 Java 代码实现 LRU 缓存
  4. ACM算法--二分法--模板
  5. web服务器之iis,apache,tomcat三者之间的比较
  6. 数据卡片_E015 如何批量汇总工作簿数据,形成独立工作簿信息卡片
  7. 用TF实现线性回归模型。
  8. 秋色园QBlog技术原理解析:开篇:整体认识(一)
  9. ubuntu 16.04 远程挂载硬盘
  10. 免疫算法(Immune Algorithm,IA)实例详解
  11. 7月30日PMP考试注意事项
  12. 专科计算机毕业论文范文 致谢,大专毕业设计致谢模板(精选范文3篇)
  13. 哪个不是计算机使用的汉子编码,下列不是计算机上使用的汉字编码的是( )。 A.字型码 B.外码 C.内码 D.条形码...
  14. python代码格式化工具下载_python 代码格式化工具:autopep8
  15. html如何读取pdf,html页面读取PDF小案例
  16. MySQL给表和字段添加注释
  17. ## Python笔记
  18. 03 - JS数据类型转换/判断相等
  19. selenium爬取笔记
  20. RGB图像卷积生成Feature map特征图过程

热门文章

  1. vmware nat模式网络不通_笨笨狗教你如何解决VMware虚拟机桥接网络不通问题?
  2. java中channelmessage,MessageStore支持的QueueChannel与Spring Integration Java Config
  3. linux命令看文件内容,Linux文件内容查看相关命令
  4. 条令考试小程序辅助器_应知应会条令纲要学习微课堂(六)
  5. python和php可以一起用吗_Apache同时支持PHP和Python的配置方法
  6. 7z解压crc错误_winrar压缩包提示crc校验和错误,文件被破坏的解决办法
  7. java hh mm ss_【Java基础】比较时间大小(以HH:mm:ss格式为例)
  8. 刚刚,这几门保证就业的算法类课程,居然能免费听了!
  9. mysql 中有没有临时表_MySQL 中的两种临时表
  10. 《c语言从入门到精通》看书笔记——第2章 算法