Delphi内存管理器.pdf

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 7 章 Delphi 的内存管理器 最小化内核中并不包含内存管理器,这表明使用最小化内核开发应用程序,与使 用汇编一样 “原始”:需要使用标准的Win32 API 来分配、使用和管理内存块。但是这 通常会存在效率问题,也可能会导致内存漏洞。 如果代码中使用到需要动态内存的数据类型,那么这些数据类型的内部例程将访 问Delphi 的内存管理器。这些数据类型中就包括了 AnsiString。这意味着绝大多数 的Delphi 程序都需要内存管理器。 除了缺省的内存管理器外,Delphi 还实现了 ShareMem.pas 和相应的内存管理模 块 borlndmm.dll ,以同步DLL 与HOST 程序中的内存管理器。 与缺省的内存管理器一样,共享内存管理器(borlndmm.dll) 并不是最有效率的。因 此某些时候,选择第三方的内存管理器可能会得到更好的性能。 开发人员随时可以写一个内存管理器来嘲笑一下那个叫 borlndmm.dll 的东西。但 在开始动手之前,请确认你已理解本章所述的全部细节,否则你可能不得不面对一次 次的进程崩溃,并无可奈何地在 uses 关键字的后面加入 ShareMem。 知己知彼,才能无往不利。否则,笑到最后的还会是 Borland 。 7.1 Delphi 的内存管理器实现框架 Delphi 在 GetMem.inc 中实现了自己的内存管理器。对于应用程序模块来说,除了变量、 常量和系统内存的数据结构之外,其他任何时候的内存分配行为,只可能是如下三种情况之一: 通过操作系统 API 进行的进程内内存分配。 使用 Delphi 内存管理例程进行的堆分配。 Delphi 源代码分析 ·170 · 第 7 章 Delphi 的内存管理器 ① 通过汇编指令或者局部变量定义进行的栈分配 。 通过操作系统 API 进行的内存分配主要有虚地址内存分配和堆分配。前者是指使用 API : VirtualAlloc()进行的分配,后者是指用 API :HeapAlloc()进行的分配。 Delphi 内存管理例程中的所谓“堆分配”,与操作系统中的“堆”概念并不一致。Delphi 中 指的是使用“堆”这种数据结构进行内存管理的方法,而操作系统中指的是一个堆内存区。② 在 GetMem.inc 中,Delphi 封装了操作系统 API ,使得用户可以直接分配内存,而无须考 虑内存具体在哪个虚地址空间、或者内存页中。 使用 Delphi 的开发人员不必了解任何有关操作系统内存分配的细节。对于这些开发者来说: 任何一块(既定长度的) 内存都是连续的,可以通过字节序遍历一个数据结构,或者在长度边界相 容的情况下进行强制转换。 Delphi 通过图 7.1 所示的内存管理器框架对 API 实行封装: 用户代码层 System.pas MemMgr(域) GetMem.inc Win32 API GetMem() _GetMem() GetMem SysGetMem() New() _ New() 用 Win32 API 分配 内存,并 FreeMem() _ FreeMem() FreeMem SysFreeMem() 使用 “堆”这 种数据结构进 Dispose() _Dispose()

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档