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

2023-05-16

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(程序的错误)。如果内存泄露一直存在的话,就有可能会造成内存不足而导致宕机。这就好比,如果水龙头一直嘀嗒嘀嗒地漏水,那么一晚上的时间水桶就可能会装满并溢出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 用quagga建立BGP会话

    本文将讲述使用quagga建立一个BGP会话 本次测试拓扑 假设运营商A与运营商B建立BGP对等互联来交换路由 下面是她们的AS号和IP地址范围 xff1a 运营商 A AS38372 xff0c IP段 172 16 0 0 16 xff
  • c++中堆、栈内存分配概念示例讲解

    首先来看看主要有几种程序内存分配 xff1a 一个由C C 43 43 编译程序占用内存分为以下几个部分 1 栈区 xff08 stack xff09 由编译器自动分配释放 xff0c 存放函数参数值 xff0c 局部变量值等 其操作方式类
  • winform窗体控件多,加载慢、卡顿的解决办法

    protected override CreateParams CreateParams get CreateParams cp 61 base CreateParams cp ExStyle 61 0x02000000 用双缓冲绘制窗口的
  • c# 中ToolStrip控件中button控件,显示文字和图标

    1 同时显示文字和图标 DisplayStyle 属性设为 ImageAndText DisplayStyle属性用来设置图标的显示状态为 图片 文字 图片和文字 ImageRelation 属性设为 ImageBeforeText Tex
  • C#中的线程池使用方法

    1 线程池的概念 许多应用程序使用多个线程 xff0c 但这些线程经常在休眠状态中耗费大量的时间来等待事件发生 其他线程可能进入休眠状态 xff0c 并且仅定期被唤醒以轮询更改或更新状态信息 xff0c 然后再次进入休眠状态 为了简化对这些
  • C# 读写ini配置文件demo

    INI就是扩展名为 34 INI 34 的文件 其实他本身是个文本文件 可以用记事本打工 主要存放的是用户所做的选择或系统的各种参数 INI文件其实并不是普通的文本文件 它有自己的结构 由若干段落 SECTION 组成 在每个带括号的标题下
  • C#实现实体类和XML相互转换

    一 实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法 xff0c 将实体类序列化 public static string XmlSerialize lt T gt T obj using
  • C# 中xml数组的序列和反序列化方法

    先来看xml lt xml version 61 39 1 0 39 gt lt root xmlns xsi 61 39 http www w3 org 2001 XMLSchema instance 39 xmlns xsd 61 39
  • c#中使用XSLT将xml文档转换为html文档方法

    c 使用XSLT将xml文档转换为html文档 使用xslt可以将xml文档转成html xff0c 如下c 函数 xff1a 需要引用下面的命名空间 xff1a using System Xml using System Xml Xsl
  • C#控件常用设计整理大全

    1 常用属性 xff08 1 xff09 Name属性 xff1a 用来获取或设置窗体的名称 xff0c 在应用程序中可通过Name属性来引用窗体 xff08 2 xff09 WindowState属性 xff1a 用来获取或设置窗体的窗口
  • C# 获取可执行文件路径的上上级目录的方法

    1 DirectoryInfo di 61 new DirectoryInfo string Format 64 34 0 34 Application StartupPath di FullName 就是你想要的 有几个就是往回退几层 2
  • npm install error code EINTEGRITY sha1

    npm install error code EINTEGRITY sha1 其他环境代码打包至另一个环境 npm install 安装依赖报错 13023 error code EINTEGRITY 13024 error sha1 Lg
  • Winform中FormClosing与FormClosed区别与使用

    FormClosing与FormClosed事件 都是关闭窗体触发的事件 xff0c 区别 FormClosing事件 是在 关闭窗体时发生 xff0c 用户可以在该事件中 取消关闭 xff0c 窗体仍然保持打开状态 因此可以在该事件中提示
  • C#实现软键盘的几个关键技术实现方法

    在嵌入式应用和一些安全软件中经常需要不通过物理键盘输入 xff0c 虽然微软提供了也一个软键盘 xff0c 但这个软件盘不能定制界面不能自动感应当前光标是否处于输入状态 xff0c 所以有时候我们还是需要自己来实现这个软键盘 本文将讲解自己
  • C#中发送消息给指定的窗口到消息循环

    public class Note 声明 API 函数 DllImport 34 User32 dll 34 EntryPoint 61 34 SendMessage 34 private static extern IntPtr Send
  • C# 获得另一个窗体句柄并发送消息(使用windows API)

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • C# SendMessage用法(调用windows API)

    函数功能 xff1a 该函数将指定的消息发送到一个或多个窗口 此函数为指定的窗口调用窗口程序 xff0c 直到窗口程序处理完消息再返回 而函数PostMessage不同 xff0c 将一个消息寄送到一个线程的消息队列后立即返回 函数原型 x
  • dos下操作mysql数据库常用命令

    1 启动数据 net start mysql 2 连接数据库 mysql u root p 3 创建数据库 create database mytest xff1b 4 删除数据库 drop database mytest xff1b 5
  • C# 中IntPtr 与 string,数组互转

    一 IntPtr 与 string互转 string str 61 34 aa 34 IntPtr init 61 Marshal StringToHGlobalAnsi str string ss 61 Marshal PtrToStri
  • C#中使用SendMessage进行进程通信,可发送字符串,结构体(不能发送类类型)。

    发送时只能以结构体形式发送 xff0c 类的话会提示 指定结构必须能直接复制到本机结构中 xff0c 或是具有布局信息 的错误提示 以下两种结构体示例都可以被发送 public struct A public A int a name 61

随机推荐

  • c#windows消息循环sendmessage实例

    DllImport 34 User32 dll 34 EntryPoint 61 34 SendMessage 34 private static extern int SendMessage IntPtr hWnd 信息发往的窗口的句柄
  • mysql 8.0.19 winx64安装及修改初始密码

    本文为大家分享了mysql 8 0 19 winx64安装教程 xff0c 供大家参考 xff0c 具体内容如下 1 下载mysql 8 0 19 winx64 1 1 进入地址 xff1a https dev mysql com down
  • ARM映像文件

    ARM映像文件 ARM中的各种源文件 xff08 包括汇编文件 xff0c C语言程序及C 43 43 程序等 xff09 经过ARM编译器编译后生成ELF xff08 Executable and linking format xff09
  • mysql安装问题汇总

    注意 xff0c xff08 1 xff09 首次安装mysql时自动生成密码后必须再手动改密码 xff0c 否则会提示修改密码 xff08 2 xff09 注意cmd命令里的字符格式 xff08 3 xff09 修改密码有些情况下不能设置
  • mysql数据库迁移到另一台电脑上

    解决办法 mysql要转换到另一台机器上面 xff0c 最重要的要考虑以下几个问题 1 数据库使用什么存储引擎 xff0c 如果是myisam的话 xff0c 可以把data目录复制移走 但如果是innodb的话 xff0c 千万不要用这种
  • winform的UI设计关键属性汇总

    1 将控件的坐标转换成屏幕的坐标 br KeyBoard StartPosition 61 FormStartPosition Manual br Point showPoint 61 ActiveTBox PointToScreen ne
  • winform中UI设计分辨率问题

    1 UI设计可以自适应或固定分辨率 xff0c 自适应需要手动写调整控件尺寸位置代码 xff1b 固定分辨率需要固定尺寸的UI资源图片 xff08 如背景图片 xff09 和固定的终端分辨率 xff08 如pc端不一致需调整分辨率为初始设计
  • C#中改变进度条(progressbar)的颜色

    改变系统自带进度条的方法就是重绘了 具体方法如下 xff1a 1 自定义控件继承自ProgressBar xff0c 如下 xff1a public class CustomProgressBar ProgressBar public Cu
  • c#中设计器中窗体释放  protected override void Dispose(bool disposing)改写解决部分窗体线程释放不彻底问题

    c 中设计器中窗体释放 protected override void Dispose bool disposing 改写解决部分窗体线程释放不彻底问题 lt summary gt 清理所有正在使用的资源 lt summary gt lt
  • 每个Form类都实现了IWin32Window接口!

    每个Form类都实现了IWin32Window接口 xff01 Form Show IWin32Window 在From1的cs文件中实例化Form2 myForm2 Show this 就可以弹出非模态的窗体 而且form2是Form1的
  • c#winform控件过多卡顿问题解决方案

    近期在项目中遇到了登录以及切换界面时 xff0c 界面不停闪烁的问题 xff0c 经过查阅发现以下方法可以成功解决该问题 将下面代码添加到窗体代码中即可 xff1a protected override CreateParams Creat
  • 子类继承父类后调用virtual函数问题(base.函数名)

    void Main SonB s 61 new SonB s Show 先调用子类的函数 xff0c 再调用基类的函数 xff08 在子类方法中base Show xff09 xff0c 一共messageBox show 了两次 publ
  • MVVM简介与运用

    前言 在介绍MVVM框架之前 xff0c 先给大家简单介绍一下MVC MVP框架 xff08 由于本博文主要讲解MVVM xff0c 所以MVC和MVP将简化介绍 xff0c 如果需要我将在以后的博文中补充进来 xff09 MVC框架 xf
  • 基于Tensorflow 三层神经网络拟合二次函数(附代码与解析)

    文章目录 前言一 隐藏层函数二 生成二次函数与损失函数 1 二次函数与画图2 损失函数三 训练数据总结 前言 刚入手深度学习 xff0c 结合这几天看的视频与内容 xff0c 将其整合成文章 提示 xff1a 以下是本篇文章正文内容 xff
  • C#中如何获取鼠标及控件的位置坐标(相对于屏幕)

    0 xff1a Control PointToScreen xff1a 将指定工作区点的位置计算成屏幕坐标 1 xff1a Control MousePosition 鼠标相对于屏左上角的坐标 xff1b 2 xff1a this Poin
  • windows系统-汇编语言的语法是“操作码+操作数”

    在汇编语言中 xff0c 1行表示对CPU的一个指令 汇编语言指令的语法结构是操作码 43 操作数 xfffc xff08 也存在只有操作码没有操作数的指令 xff09 操作码表示的是指令动作 xff0c 操作数表示的是指令对象 操作码和操
  • windows系统-程序编译过程

    系统调用和高级编程语言的移植性 操作系统的硬件控制功能 xff0c 通常是通过一些小的函数集合体的形式来提供的 这些函数及调用函数的行为统称为系统调用 xff08 system call xff09 xff0c 也就是应用对操作系统 xff
  • windows系统-汇编语言与机器码的关系

    接下来就让我们进入到本章的前半部分 在前面章节中已经多次提到 xff0c 计算机CPU能直接解释运行的只有本地代码 xff08 机器语言 xff09 程序 用C语言等编写的源代码 xff0c 需要通过各自的编译器编译后 xff0c 转换成本
  • windows系统-函数的条件分支实现用汇编语言解释

    下面让我们来看一下条件分支的实现方法 条件分支的实现方法同循环处理的实现方法类似 xff0c 使用的也是cmp指令和跳转指令 xff0c 这一点估计大家也预料到了 没错 xff0c 条件分支就是利用这些指令来实现的 不过 xff0c 为了以
  • windows系统-程序加载时生成栈和堆的过程

    EXE文件的内容分为再配置信息 变量组和函数组 xff0c 这一点想必大家都清楚了吧 不过 xff0c 当程序加载到内存后 xff0c 除此之外还会额外生成两个组 xff0c 那就是栈和堆 栈是用来存储函数内部临时使用的变量 xff08 局