代码审查-超级猛料.DOCVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
代码审查-超级猛料

DELPHI内存详解 内存组成、栈、堆、内存管理器、三方内存管理器、 内存越界、内存泄露 作者 樊升:sheng.fan@ 陆元会:Kingron@ 文档历史 日期 版本 作者 描述说明 2009-12-11 1.0 樊升 完成初始版 2010-6-3 1.1 樊升 增加了一些内容 2010-06-04 1.2 陆元会 审核修改了一些内容 目录 1 应用程序的内存组成 5 2 栈和堆 5 2.1 栈和堆的内存分配比较 6 2.2 栈和堆的申请方式方面 6 2.3 栈和堆的系统响应方面 6 2.4 栈和堆的大小限制方面 6 3 DELPHI的内存实现 6 4 变量初始化 7 5 用const来提高应用程序在多核多线程下的性能 7 6 函数返回值 7 7 内存申请和释放 9 7.1 内存分配常见函数 9 7.2 GetMem和FreeMem、GetMemory和FreeMemory 9 7.3 New和Dispose 9 7.4 StrAlloc和StrDispose 9 7.5 AllocMem 9 7.6 SysGetMem和SysFreeMem 10 8 String和Pchar 10 8.1 String的结构 10 8.2 直接给常量赋值,系统会自动分配内存,自动释放 10 9 数组和动态数组 10 9.1 数组到底是在栈中还是在堆中 10 9.1.1 固定数组在函数体内分配是在栈中的 10 9.1.2 固定数组在类中分配是在堆中的 11 9.1.3 固定数组全局变量是在堆中的 11 9.1.4 动态数组不管在函数体中、类中、全局变量都是在堆中的 11 9.2 DELPHI的数组和动态数组都是自动管理的,不需要手动释放 11 10 结构体 12 10.1 结构体是在栈中还是堆中 12 10.1.1 在函数体中定义的结构体是在栈中的 12 10.1.2 结构体在类中、全局变量都是在堆中 12 10.1.3 结构体指针,指针地址在栈中,结构体内容在堆中 12 10.2 结构体的申请和释放 13 11 内存操作:复制、清空、填充 13 11.1 内存复制 13 11.2 内存清空与填充 16 12 内存映射 17 13 FastMM内存管理器 17 13.1 用FastMM加快DELPHI IDE的速度 17 13.2 用FastMM加快我们自己应用程序的速度 17 13.3 用FastMM检测内存泄漏 17 14 常见内存错误、代码审查 18 14.1 PCHAR指针末尾没有赋#0 18 14.2 没初始化内存出现错误,用FillChar、ZeroMemory 18 14.3 函数返回值没有初始化 18 14.4 PwideChar(string)内存格式不一致,强制转换,导致内存错乱 18 14.5 申请的函数和释放的函数不一致 18 15 附录:内存函数 18 16 感谢人员名单 21 17 参考资料 21 应用程序的内存组成 对于Windows 32来说,系统会给每个进程4GB的地址空间,低端2GB($7FFFFFFF)给用户支配;高端2GB($FFFFFFFF)留给系统使用,这个4G的地址空间叫“虚拟地址表”,虚拟地址表不是真实的内存。 这个“虚拟地址表”上有4GB的空间,每个程序都有这样的一个表,但他们并不会冲突,这样就阻断了一个进程对另一个进程的访问,系统在需要的时候会把他们映射成具体的真实内存地址。 可以使用GlobalMemoryStatus来获取内存信息,获取后的信息放在TMemoryStatus结构体中。 _MEMORYSTATUS = record dwLength: DWORD; {结构长度} dwMemoryLoad: DWORD; {表示可用内存比例的一个整数, 100 表示内存都可用} dwTotalPhys: DWORD; {物理内存总数} dwAvailPhys: DWORD; {可用物理内存总数} dwTotalPageFile: DWORD; {虚拟内存总数} dwAvailPageFile: DWORD; {可用虚拟内存总数} dwTotalVirtual: DWORD; {虚地址表中的地址总数} dwAvailVirtual: DWORD; {虚地址表中可用的地址总数} end;_MEMORYSTATUS; 在用户的2GB地址空间中,低端的0-$FFFF是用于空指针分配,高端的$7FFF0000-$7FFFFFFF用于进程的临界区,这两个地址都是禁止访问的。进程真正的私有空间地址是:$10000-$FFEFFFF。我们可以通过GetSystemIn

您可能关注的文档

文档评论(0)

zhuwo + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档