三、内存管理应用程序设计.ppt

  1. 1、本文档共116页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主讲老师:刘志强 三、 内存管理应用程序设计 内存管理的相关概念 内存数据空间的动态分配 内存代码空间的动态分配 1.内存管理 主要任务 对内存储器进行分配、变换、保护和扩充,存储管理还应该能够在内存和外存之间交换数据和代码。 在Windows操作系统下,存储器被保护起来,程序和用户无法直接访问,需要在程序中通过静态和动态两种方式来访问。 Windows的内存管理完成物理内存和虚拟内存之间的交换,虚拟内存是32位的,多达4GB的大小,内存管理还提供了一个核心服务,完成内存映射文件、写时复制内存和用户程序使用的大量和稀疏内存的管理。 两种使用内存的基本方法 静态方法 数组,例如 Student student[501] 动态方法 指针,例如 Student *student=new Student[count+1] Windows NT 内存管理 Windows可以管理4GB大小的空间;操作系统使用其中2GB空间,每个用户进程可以使用2GB的专用地址空间。 Win32 API提供: VirtualXXX形式的以页为单位的虚拟内存函数; CreateMapFile、MapViewofFile内存映射文件函数; HeapXXX堆栈函数。 内存管理 Windows NT在X86体系下虚拟地址空间的分布: 例3-6 动态申请虚拟内存 整数阶乘计算到13就会出错。怎么办? 使用动态申请的虚拟内存空间编写计算任何数的阶乘的程序。 解体思路: 计算较大数的阶乘的计算一般使用数组来存放阶乘的位数。但是C++中数组最大长度是10万,这将影响使用的范围。 可以通过使用动态内存分配(指针)来解决。 本程序采用动态申请虚拟内存空间的方法,不使用物理内存,而是使用虚拟内存,从而使求解问题的范围扩大。 程序算法 ① 从命令行接收输入并使用strtol函数将其转换为long型的整数(n为要求阶乘的数)。 ② 通过函数VirtualAlloc保留n×10240的地址空间,申请n×1024的地址空间。 ③ 调用计算阶乘函数lfac。 ④ 一位一位显示阶乘结果。 ⑤ 通过函数VirtulFree释放虚拟内存。 函数VirtualAlloc 用函数VirtualAlloc保留或申请虚拟内存空间。 该函数格式如下: LPVOID VirtualAlloc( LPVOID lpAddress,   // 起始地址 DWORD dwSize,   // 大小 DWORD flAllocationType, // 分配类型(MEM_COMMIT等) DWORD flProtect   // 保权限(PAGE_READWRITE等) ); 函数VirtualFree 使用函数VirtualFree释放虚拟内存,函数格式: BOOL VirtualFree( LPVOID lpAddress, //起始地址 DWORD dwSize, //大小 DWORD dwFreeType //释放类型(MEM_RELEASE等) ); 源程序 #include iostream.h #include windows.h int lfac(int *a, int n) { int sum,sc; for(int i=0;in*1024;i++) //空间清零 a[i]=0; a[0]=1; //最低位设为1 for(i=2;i=n;i++) //n的阶乘的循环 { sc=0; for(int j=0;jn*1024;j++) //阶乘每一位处理的循环 { sum=a[j]*i+sc; //上一次进位值和当前计算结果求和 sc=sum/10; //存放进位数值 a[j]=sum%10; //将余数存入数组 } } if(sc0) return -1; else return 0; } 举例求5! a[0]=1; //最低位设为1 for(i=2;i=n;i++) //n的阶乘的循环 { sc=0; for(int j=0;jn*1024;j++) //阶乘每一位处理的循环 { sum=a[j]*i+sc; //上一次进位值和当前计算结果求和 sc=sum/10; //存放进位数值 a[j]=sum%10; //将余数存入数组 }

文档评论(0)

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

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

1亿VIP精品文档

相关文档