HeapCreate和HeapAlloc混淆

我正在做一个关于dynamic内存pipe理的项目。 我遇到了关于HeapCreate和HeapAlloc函数的混淆。

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

比方说winHandle = HeapCreate(0,2 * 1024,0);

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

比方说,我三次调用HeapAlloc(winHandle,0,1024)。 分配的总大小将是3 * 1024.它比堆大小2 * 1024大,但没有错误。

任何人都可以帮我回答这个问题吗?

谢谢,

这里是testing代码。

// 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); 

Solutions Collecting From Web of "HeapCreate和HeapAlloc混淆"

您对API的使用略有不同:

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

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

编辑

请注意,Windows会将系统页面大小的最大倍数调整为最大值。 所以堆的实际大小可能比你要求的大。 此外,堆将使用这些内存中的一部分用于自己的内部簿记。 所以你将无法使单个分配等于堆的大小。