全面介绍Windows内存管理机制及C++内存分配

全面介绍Windows内存管理机制及C++内存分配

ID:37461874

大小:31.50 KB

页数:8页

时间:2019-05-24

全面介绍Windows内存管理机制及C++内存分配_第1页
全面介绍Windows内存管理机制及C++内存分配_第2页
全面介绍Windows内存管理机制及C++内存分配_第3页
全面介绍Windows内存管理机制及C++内存分配_第4页
全面介绍Windows内存管理机制及C++内存分配_第5页
资源描述:

《全面介绍Windows内存管理机制及C++内存分配》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、本文背景:在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。本文目的:对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。本文内容:本文一共有六节,由于篇幅较多,故按节发表。其他章节请看本人博客的Windows内存管理及C++内存分配实例(一)(二)(三)(四)和(五)。6.内存管理机制--堆栈(Stack)·使用场合操作系统为每个线程都建立一个默认堆栈,大小为1M。这个堆栈是供函数调用时使用,线程内函数里

2、的各种静态变量都是从这个默认堆栈里分配的。·堆栈结构默认1M的线程堆栈空间的结构举例如下,其中,基地址为0x00040000,刚开始时,CPU的堆栈指针寄存器保存的是栈顶的第一个页面地址0x0013F000。第二页面为保护页面。这两页是已经分配物理存储器的可用页面。随着函数的调用,系统将需要更多的页面,假设需要另外5页,则给这5页提交内存,删除原来页面的保护页面属性,最后一页赋予保护页面属性。当分配倒数第二页0x00041000时,系统不再将保护属性赋予它,相反,它会产生堆栈溢出异常STATUS_STACK_OVERFLOW,如果程序没有处理它,则线程将退出。最后

3、一页始终处于保留状态,也就是说可用堆栈数是没有1M的,之所以不用,是防止线程破坏栈底下面的内存(通过违规访问异常达到目的)。当程序的函数里分配了临时变量时,编译器把堆栈指针递减相应的页数目,堆栈指针始终都是一个页面的整数倍。所以,当编译器发现堆栈指针位于保护页面之下时,会插入堆栈检查函数,改变堆栈指针及保护页面。这样,当程序运行时,就会分配物理内存,而不会出现访问违规。·使用例子改变堆栈默认大小:有两个方法,一是在CreateThread()时传一个参数进去改变;二是通过链接命令:#pragmacomment(linker,"/STACK:102400000,10

4、24000")第一个值是堆栈的保留空间,第二个值是堆栈开始时提交的物理内存大小。本文将堆栈改变为100M。堆栈溢出处理:如果出现堆栈异常不处理,则导致线程终止;如果你只做了一般处理,内存结构已经处于破坏状态,因为已经没有保护页面,系统没有办法再抛出堆栈溢出异常,这样的话,当再次出现溢出时,会出现访问违规操作STATUS_ACCESS_VIOLATION,这是线程将被系统终止。解决办法是,恢复堆栈的保护页面。请看以下例子:C++程序如下:boolhandle=true;staticMEMORY_BASIC_INFORMATIONmi;LPBYTElpPage;//得

5、到堆栈指针寄存器里的值_asmmovlpPage,esp;//得到当前堆栈的一些信息VirtualQuery(lpPage,&mi,sizeof(mi));//输出堆栈指针printf("堆栈指针=%x",lpPage);//这里是堆栈的提交大小printf("已用堆栈大小=%d",mi.RegionSize);printf("堆栈基址=%x",mi.AllocationBase);for(inti=0;i<2;i++){__try{__try{__try{cout<<"**************************"<

6、静态分配导致的堆栈异常,系统默认不抛出异常,捕获不到//chara[1024*1024];//动态分配栈空间,有系统调用Alloca实现,自动释放Add(1000);//系统可以捕获违规访问int*p=(int*)0xC00000000;*p=3;cout<<"执行结束"<

7、(GetExceptionCode()==STATUS_STACK_OVERFLOW?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH){cout<<"Exception2"<

8、;//查询

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。