8

由于各种原因,我正在尝试将代码从 C 运行时移植到使用 Windows 堆 API 的代码。我遇到了一个问题:如果我将 /// 调用重定向到// ( mallocwith for the handle ) ,内存似乎分配正确(没有返回错误指针,也没有抛出异常),但是我的库由于某种原因,移植说“未能分配内存”。callocreallocfreeHeapAllocHeapReAllocHeapFreeGetProcessHeap

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

我检查了分配不是太大(> = 0x7FFF8 字节),但它们不是。

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

如果是这样,它是什么?如果不是,那么为什么静态Microsoft CRT(包含在 Visual Studio 中)在调用malloc/calloc之前会采取一些额外的步骤HeapAlloc?我怀疑有区别,但我想不出它可能是什么。

谢谢!

4

2 回答 2

3

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

区别不是根本的,但是HeapReAlloc(使用RtlReAllocateHeap)不会自动将空指针视为调用的提示HeapAlloc;相反,它失败了。

于 2011-01-04T03:20:52.950 回答
0

另一个重要区别:

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

未定义的行为,而

void *ptr = NULL;
free(ptr);

定义明确(未执行任何操作)。

于 2018-09-24T13:02:15.080 回答