Winapi malloc和HeapAlloc之间有根本区别吗(除了可移植性)?
出于各种原因,我正在尝试将代码从C运行时移植到使用Windows堆API的运行时。我遇到了一个问题:如果我将Winapi malloc和HeapAlloc之间有根本区别吗(除了可移植性)?,winapi,malloc,heap,msvcrt,heapalloc,Winapi,Malloc,Heap,Msvcrt,Heapalloc,出于各种原因,我正在尝试将代码从C运行时移植到使用Windows堆API的运行时。我遇到了一个问题:如果我将malloc/calloc/realloc/free调用重定向到HeapAlloc/HeapFree(使用GetProcessHeap句柄),内存似乎分配正确(没有返回错误指针,也没有抛出异常),但我移植的库说,出于某种原因,“无法分配内存” 我在MicrosoftCRT(下面使用堆API)和另一家公司的运行时库(下面使用全局内存API)上都尝试过这一点;这两种方法的malloc都能很好地
malloc
/calloc
/realloc
/free
调用重定向到HeapAlloc
/HeapFree
(使用GetProcessHeap
句柄),内存似乎分配正确(没有返回错误指针,也没有抛出异常),但我移植的库说,出于某种原因,“无法分配内存”
我在MicrosoftCRT(下面使用堆API)和另一家公司的运行时库(下面使用全局内存API)上都尝试过这一点;这两种方法的malloc都能很好地与库配合使用,但由于某些原因,直接使用Heap API是行不通的
我已经检查了分配是否太大(>=0x7FFF8字节),它们也不太大
我能想到的唯一问题是记忆对齐;是这样吗?或者除此之外,堆API和CRT内存API之间是否有我不知道的根本区别
如果是,是什么?如果没有,那么为什么静态Microsoft CRT(随Visual Studio提供)在调用HeapAlloc
之前在malloc
/calloc
中执行一些额外的步骤?我怀疑这有区别,但我想不出可能是什么
谢谢大家! 当我发现困难的时候
区别不是根本性的,但
heapreloc
(使用RtlReAllocateHeap
)不会自动将空指针视为调用HeapAlloc
的提示;相反,它失败了。另一个重要区别是:
void *ptr = NULL;
HeapFree(GetProcessHeap(), 0, ptr);
有,而
定义良好()。HeapAlloc也不会为0大小的指针分配内存,而malloc会这样做。此外,HeapAlloc无法调用malloc,因为如果新处理程序无法纠正问题,将导致循环调用
void *ptr = NULL;
free(ptr);