【问题标题】: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 中采取一些额外的步骤?我怀疑有区别,但我想不出它可能是什么。

谢谢!

【问题讨论】:

    标签: winapi malloc heap-memory msvcrt heapalloc


    【解决方案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,因为如果新的处理程序无法纠正问题,则会导致循环调用
      猜你喜欢
      • 2013-09-02
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多