出于各种原因,我正在尝试将代码从C运行时移植到使用的代码。我遇到了一个问题:如果我将malloc/calloc/realloc/free调用重定向到HeapAlloc/HeapReAlloc/HeapFree (句柄为GetProcessHeap ),内存似乎被正确分配(没有返回坏指针,也没有抛出异常),但我正在移植的库由于某种原因说“未能分配内存”。
我在Microsoft CRT (在下面使用Heap API )和另一家公司的运行时库(在下面使用全局内存API )中都尝试过这一点;两者的malloc在库中都能很好地工作,但由于某些原因,直接使用Heap API并不有效。
我已经检查过分配不太大(>= 0x7FFF8字节),而且它们不是。
我能想到的唯一问题是内存对齐,是这样吗?除此之外,我不知道的堆API和CRT内存API之间有根本的区别吗?
如果是,那又是什么呢?如果不是,那么为什么静态Microsoft (包括在Visual中)在调用malloc/calloc之前在HeapAlloc中采取一些额外的步骤?我怀疑有什么不同,但我想不出会有什么区别。
谢谢!
发布于 2011-01-04 03:20:52
当我发现困难的方法..。
这种区别并不是根本的,但是HeapReAlloc (使用RtlReAllocateHeap)并不会自动将空指针视为调用HeapAlloc的提示;相反,它会失败。
发布于 2018-09-24 13:02:15
另一个重要的区别是:
void *ptr = NULL;
HeapFree(GetProcessHeap(), 0, ptr);有未定义行为,而
void *ptr = NULL;
free(ptr);定义良好(不执行手术)。
更新2021:
HeapFree documentation 已更新于2021年1月发布,现在声明:
[in] lpMem指向要释放的内存块的指针。此指针由HeapAlloc或HeapReAlloc函数返回。这个指针可以是空。
老实说,目前还不清楚这是否适用于特定的SDK版本,还是从任何时候开始。可以肯定,该参数已经在10.0.16299.0上用_Frees_ptr_opt_标记,因此可能只是文档问题。
https://stackoverflow.com/questions/4588660
复制相似问题