malloc和HeapAlloc之间是否存在根本区别(除了可移植性)?

时间:2011-01-03 21:45:12

标签: winapi malloc heap msvcrt heapalloc

我有代码,由于各种原因,我正在尝试从C运行时移植到使用Windows Heap API的代码。我遇到了一个问题:如果我将malloc / calloc / realloc / free次来电重定向到HeapAlloc / HeapReAlloc / {{一些(句子为HeapFree),内存似乎被正确分配(没有返回错误的指针,也没有抛出异常),但是我正在移植的库说“为某些人分配了内存”原因。

我已经尝试过使用Microsoft CRT(使用下面的Heap API)和另一家公司的运行时库(使用下面的Global Memory API);两者的malloc适用于库,但由于某些原因,直接使用Heap API不起作用。

我已经检查过分配不是太大(> = 0x7FFF8字节),而它们不是。

我能想到的唯一问题是内存对齐;那是这样吗?或者除此之外,Heap API和我不知道的CRT内存API有根本区别吗?

如果是这样,它是什么?如果没有,那么为什么 static Microsoft CRT(Visual Studio附带)在调用GetProcessHeap之前在malloc / calloc中采取了一些额外的步骤?我怀疑存在差异,但我想不出它可能是什么。

谢谢!

2 个答案:

答案 0 :(得分:3)

当我发现困难的方式......

差异不是根本,但HeapReAlloc(使用RtlReAllocateHeap会自动将空指针视为提示调用HeapAlloc;它失败了。

答案 1 :(得分:0)

另一个重要区别:

void *ptr = NULL;
HeapFree(GetProcessHeap(), 0, ptr);

undefined behavior,而

void *ptr = NULL;
free(ptr);

定义明确(no operation performed)。