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)区别与注意