malloc 和 HeapAlloc 之间是不是存在根本区别(除了可移植性)? [复制]

Posted

技术标签:

【中文标题】malloc 和 HeapAlloc 之间是不是存在根本区别(除了可移植性)? [复制]【英文标题】:Is there a fundamental difference between malloc and HeapAlloc (aside from the portability)? [duplicate]malloc 和 HeapAlloc 之间是否存在根本区别(除了可移植性)? [复制] 【发布时间】:2011-06-03 02:02:54 【问题描述】:

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

我已经在 Microsoft CRT(它使用下面的 Heap API)和另一家公司的运行时库(它使用下面的 Global Memory API)上进行了尝试;两者的 malloc 都可以很好地与库配合使用,但由于某种原因,直接使用 Heap API 不起作用。

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

另一个重要区别:

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

有undefined behavior,而

void *ptr = NULL;
free(ptr);

定义明确 (no operation performed)。

【讨论】:

【参考方案2】:

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

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

【讨论】:

HeapAlloc 也不会为 0 大小的指针分配内存,而 malloc 会。此外,HeapAlloc 无法调用 malloc,因为如果新的处理程序无法纠正问题,则会导致循环调用

以上是关于malloc 和 HeapAlloc 之间是不是存在根本区别(除了可移植性)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File

Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面

内存分配(malloc,new,VirtualAlloc,HeapAlloc,GlobalAlloc,LocalAlloc)区别与注意

HeapAlloc簿记

C++ / Windows:HeapAlloc() 用于无争用的每线程堆

malloc 和 free 是如何实现的?