首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

HeapAlloc累计超过HeapCreate上限没有异常,但是单次Alloc超过上限就错误退出,为什么

2012-05-20 
HeapAlloc累计超过HeapCreate上限没有错误,但是单次Alloc超过上限就异常退出,为什么?1. HeapCreate设定ini

HeapAlloc累计超过HeapCreate上限没有错误,但是单次Alloc超过上限就异常退出,为什么?
1. HeapCreate设定init为1000字节,max为1500字节
2. HeapAlloc3次600字节,都没有问题。
3. 如果改为HeapAlloc单次分配1800字节,就异常退出了。这是为什么?

源代码:

C/C++ code
#include"stdafx.h"#include<windows.h>#include<stdio.h>#include<tchar.h>HANDLE hHeap,hAllo;int _tmain(int argc, _TCHAR* argv[]){    hHeap=HeapCreate(HEAP_GENERATE_EXCEPTIONS,1000,1500);    if(NULL==hHeap){        printf("HeapCreate失败\n");        return 1;    }/*    LPVOID p1=HeapAlloc(hHeap,HEAP_ZERO_MEMORY,600);    LPVOID p2=HeapAlloc(hHeap,HEAP_ZERO_MEMORY,600);    if(NULL==p2){        printf("p2 failed\n");        return 1;    }    LPVOID p3=HeapAlloc(hHeap,HEAP_ZERO_MEMORY,600);    if(NULL==p3){        printf("p3 failed\n");        return 1;    }*/    printf("p4 begin\n");    LPVOID p4=HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1800);    if(NULL==p4){        printf("p4 failed\n");        return 1;    }    return 0;}


[解决办法]
因为每次系统分配内存时只能分配连续内存给你,多次分配,每次需要的连续内存很小,就没问题。但是如果一次分配,你需要的连续内存就非常大,就容易失败!注意:你有内存,但是地址簿一定连续。如果你有三块内存连续放置,第一块10M,第二块2M,第三块20M,而第二块已经分配好了。那么你再要21M的内存就不会成功(因为10M的20M的都小于21M),但是你分配3个7M的就能成功(从10M里拿一块,20M里拿两块)

所以尽量不要分配太大的内存,也不要分配太小的(太小的造成碎片)
[解决办法]
至于为什么能超过上限,那是因为HeapCreate根本不会用1500为上限,他会把1500扩展到页边界,也就是最少4096字节,你需要好好看MSDN来了解各个参数的含义和用法,而不是猜测着用
[解决办法]
探讨

至于为什么能超过上限,那是因为HeapCreate根本不会用1500为上限,他会把1500扩展到页边界,也就是最少4096字节,你需要好好看MSDN来了解各个参数的含义和用法,而不是猜测着用

热点排行