首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HeapCreate和HeapAlloc混淆

HeapCreate和HeapAlloc混淆
EN

Stack Overflow用户
提问于 2013-01-19 04:06:51
回答 1查看 5.7K关注 0票数 1

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

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

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

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

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

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

谢谢,

以下是测试代码。

代码语言:javascript
复制
// 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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-19 04:12:27

您对API的使用略有偏差:

代码语言:javascript
复制
HANDLE WINAPI HeapCreate(
    DWORD flOptions,
    SIZE_T dwInitialSize,
    SIZE_T dwMaximumSize );

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

编辑

请注意,Windows会将给定的最大大小舍入为系统页面大小的最接近倍数。因此,堆的实际大小可能超过您请求的大小。此外,堆将使用其中的一些内存进行自己的内部记账。因此,您不能进行与堆大小相等的单个分配。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14406818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档