10_内存分配方式和调试机制-深入浅出 MFC(李九进).pdfVIP

10_内存分配方式和调试机制-深入浅出 MFC(李九进).pdf

  1. 1、本文档共7页,可阅读全部内容。
  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文档。上传文档
查看更多
10_内存分配方式和调试机制-深入浅出 MFC(李九进)

第10章 内存分配方式和调试机制 10.1 M 内存分配 10.1.1 内存分配函数 MFCWin32 或者 C 语言的内存分配 API ,有四种内存分配API 可供使用。 (1) Win32 的堆分配函数 每一个进程都可以使用堆分配函数创建一个私有的堆──调用进程地址空间的一个或者多 个页面。DLL 创建的私有堆必定在调用 DLL 的进程的地址空间内,只能被调用进程访问。 HeapCreate 用来创建堆;HeapAlloc 用来从堆中分配一定数量的空间,HeapAlloc 分配的内 存是不能移动的;HeapSize 可以确定从堆中分配的空间的大小;HeapFree 用来释放从堆中 分配的空间;HeapDestroy 销毁创建的堆。 (2 ) Windows 传统的全局或者局部内存分配函数 由于 Win32 采用平面内存结构模式,Win32 下的全局和局部内存函数除了名字不同外,其 他完全相同。任一函数都可以用来分配任意大小的内存(仅仅受可用物理内存的限制)。用 法可以和 Win16 下基本一样。 Win32 下保留这类函数保证了和 Win16 的兼容。 (3 ) C 语言的标准内存分配函数 C 语言的标准内存分配函数包括以下函数: malloc ,calloc,realloc ,free,等。 这些函数最后都映射成堆 API 函数,所以,malloc 分配的内存是不能移动的。这些函数的 调式版本为 malloc_dbg ,calloc_dbg,realloc_dbg ,free_dbg,等。 (4 ) Win32 的虚拟内存分配函数 虚拟内存 API 是其他API 的基础。虚拟内存 API 以页为最小分配单位,X86 上页长度为 4KB , 可以用 GetSystemInfo 函数提取页长度。虚拟内存分配函数包括以下函数: LPVOID VirtualAlloc(LPVOID lpvAddress, DWORD cbSize, DWORD fdwAllocationType, DWORD fdwProtect); 该函数用来分配一定范围的虚拟页。参数 1 指定起始地址;参数 2 指定分配内存的长度;参 数 3 指定分配方式,取值 MEM_COMMINT 或者 MEM_RESERVE ;参数4 指定控制访问本 次 分 配 的 内 存 的 标 识 , 取 值 为 PAGE_READONLY 、 PAGE_READWRITE 或 者 PAGE_NOACCESS 。 LPVOID VirtualAllocEx(HANDLE process, LPVOID lpvAddress, DWORD cbSize, DWORD fdwAllocationType, DWORD fdwProtect); 该函数功能类似于 VirtualAlloc ,但是允许指定进程 process 。VirtaulFree 、VirtualProtect 、 VirtualQuery 都有对应的扩展函数。 BOOL VirtualFree(LPVOID lpvAddress, DWORD dwSize, DWORD dwFreeType); 该函数用来回收或者释放分配的虚拟内存。参数 1 指定希望回收或者释放内存的基地址;如 果是回收,参数 2 可以指向虚拟地址范围内的任何地方,如果是释放,参数 2 必须是 VirtualAlloc 返回的地址;参数 3 指定是否释放或者回收内存,取值为 MEM_DECOMMINT 或者 MEM_RELEASE 。 BOOL VirtualProtect(LPVOID lpvAddress, DWORD cbSize, DWORD fdwNewProtect, PDWORD pfdwOldProtect); 该函数用来把已经分配的页改变成保护页。参数 1 指定分配页的基地址;参数 2 指定保护页 的长度;参数 3 指定页的保护属性,取值 PAGE_READ 、PAGE_WRITE 、PAGE_READWRITE 等等;参数 4 用来返回原来的保护属性。 DWORD VirtualQuery(LPCVOID lpAddr

文档评论(0)

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

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

1亿VIP精品文档

相关文档