Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi malloc和HeapAlloc之间有根本区别吗(除了可移植性)?_Winapi_Malloc_Heap_Msvcrt_Heapalloc - Fatal编程技术网

Winapi malloc和HeapAlloc之间有根本区别吗(除了可移植性)?

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都能很好地

出于各种原因,我正在尝试将代码从C运行时移植到使用Windows堆API的运行时。我遇到了一个问题:如果我将
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);