HeapCreate和HeapAlloc混淆

时间:2013-01-18 20:06:51

标签: windows heap heap-memory heapalloc

我正在做一个关于动态内存管理的项目。我对HeapCreate和HeapAlloc函数感到困惑。

对于HeapCreate()函数,我们可以创建一个堆,函数将返回一个HANDLE。我们可以初始化堆的大小。

假设winHandle = HeapCreate(0,2 * 1024,0);

然后,我可以在这个堆上分配HeapAlloc函数。但我对堆的大小感到困惑。我尝试一个例子,我在这个堆上调用HeapAlloc(winHandle,0,1024)两次,所以总数将是2 * 1024.但是我仍然可以多次调用HeapAlloc而不会遇到错误。

假设我将HeapAlloc(winHandle,0,1024)调用三次。分配的总大小为3 * 1024.它大于堆大小2 * 1024.但没有错误。

有人可以帮我回答这个问题吗?

谢谢,

这是测试代码。

// create heap, and return a headle(id) for that heap
HANDLE winHandle = HeapCreate( 0, sizeof(Dog), sizeof(Dog) );


// allocate the heap header to that handle 
void* s = HeapAlloc( winHandle, 0, sizeof(Dog) );   
// check if the alloc is success or not
assert( 0 != s );
printf("%p \n", s);
// load the heap header data
Dog* heapHeader = new(s) Dog( 1, 2, 4);


// allocate the heap header to that handle 
void* ss = HeapAlloc( winHandle, 0, sizeof(Dog) );
// check if the alloc is success or not
assert( 0 != ss );
printf("%p \n", ss);
// load the heap header data
Dog* heapHeadder = new(ss) Dog( 1, 2, 4);

1 个答案:

答案 0 :(得分:4)

您对API的使用略有不同:

HANDLE WINAPI HeapCreate(
    DWORD flOptions,
    SIZE_T dwInitialSize,
    SIZE_T dwMaximumSize );

请注意,此调用的第二个参数是堆的初始大小,而不是其最大大小。当您为最大大小指定0时,Windows将在您用尽初始池后尝试为堆提交新的内存页。

修改

请注意,Windows会将最大大小舍入到最接近系统页面大小的倍数。因此堆的实际大小可能比您请求的大。此外,堆将使用一些内存来进行内部簿记。因此,您将无法使单个分配等于堆的大小。