windows - HeapCreate 和 HeapAlloc 混淆

标签 windows 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);

最佳答案

您对 API 的使用略有偏差:

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

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

编辑

请注意,Windows 会将给定的最大大小四舍五入为最接近的系统页面大小倍数。所以堆的实际大小可能比您请求的要多。此外,堆将使用其中的一些内存用于它自己的内部簿记。因此,您将无法进行等于堆大小的单个分配。

关于windows - HeapCreate 和 HeapAlloc 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14406818/

相关文章:

.net - 如何模拟慢速且无读取缓存的磁盘驱动器

windows - 以编程方式跟踪目录中的更改

java - Eclipse java应用程序堆大小不能超过4G

C++ 存储在堆上保存在堆栈上

c++ - PIMPL 和堆栈分配

c - (C) 堆分配器的实现策略?

c++ - 如何在 Visual C++ 中截断文件?

python - Pandas 填充 np.nan 问题

java - 在 VisualVm 中按对象参数对 OQL 结果集进行排序