- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- 中国软件渠道大会暨2016中国软件生态大会.DOC
- 中国音乐学院2017年招收攻读硕士学位研究生报考各研究方向.PDF
- 中小学幼儿园高级教师预报预审理论考试.DOC
- 中山大学微观经济学与管理学原理历年真题.DOC
- 中山试验高中2008年音乐特长生自主招考管理办法.DOC
- 中年级特色课程成果.DOC
- 中德安联媒体剪报精选2012年6月.PDF
- 中止培训申请表.DOC
- 中文非故事类-EDB.PDF
- 中秋节资料-辜诗雅.DOC
- 中国国家标准 GB/T 18233.4-2024信息技术 用户建筑群通用布缆 第4部分:住宅.pdf
- GB/T 18233.4-2024信息技术 用户建筑群通用布缆 第4部分:住宅.pdf
- GB/T 18978.210-2024人-系统交互工效学 第210部分:以人为中心的交互系统设计.pdf
- 《GB/T 18978.210-2024人-系统交互工效学 第210部分:以人为中心的交互系统设计》.pdf
- 中国国家标准 GB/T 18978.210-2024人-系统交互工效学 第210部分:以人为中心的交互系统设计.pdf
- GB/T 16649.2-2024识别卡 集成电路卡 第2部分:带触点的卡 触点的尺寸和位置.pdf
- 《GB/T 16649.2-2024识别卡 集成电路卡 第2部分:带触点的卡 触点的尺寸和位置》.pdf
- 中国国家标准 GB/T 16649.2-2024识别卡 集成电路卡 第2部分:带触点的卡 触点的尺寸和位置.pdf
- GB/T 17889.4-2024梯子 第4部分:铰链梯.pdf
- 《GB/T 17889.4-2024梯子 第4部分:铰链梯》.pdf
最近下载
- 百日咳试题附有答案.docx VIP
- 2024年广东省深圳市光明区人大常委会办公室招聘一般类岗位专干12人历年【综合基础知识500题】高频考点模拟试题及参考答案解析.docx VIP
- 高中语文任务驱动型材料作文:枯燥与热闹审题指导(含解析).docx VIP
- 某镇卫生院污水设计方案.pdf VIP
- 2024年广东深圳市光明区人大常委会办公室招聘一般类岗位专干3人历年【综合基础知识500题】高频考点模拟试题及参考答案解析.docx VIP
- 中考数学经验交流会发言稿.pdf
- 2024年7月广东省深圳市光明区人大常委会办公室招聘10人历年【高频考点汇总500题】模拟卷及参考答案详解.docx VIP
- 《溜冰圆舞曲和雷鸣电闪波尔卡》精品课件2023.pptx
- 水利项目安全评价报告.docx
- 2024年7月广东省深圳市光明区人大常委会办公室招聘10人历年【综合基础知识500题】高频考点模拟试题及参考答案解析.docx VIP
文档评论(0)