首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除了可移植性之外,malloc和HeapAlloc之间有根本的区别吗?

除了可移植性之外,malloc和HeapAlloc之间有根本的区别吗?
EN

Stack Overflow用户
提问于 2011-01-03 21:45:12
回答 2查看 3.4K关注 0票数 8

出于各种原因,我正在尝试将代码从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中采取一些额外的步骤?我怀疑有什么不同,但我想不出会有什么区别。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-04 03:20:52

当我发现困难的方法..。

这种区别并不是根本的,但是HeapReAlloc (使用RtlReAllocateHeap)并不会自动将空指针视为调用HeapAlloc的提示;相反,它会失败。

票数 3
EN

Stack Overflow用户

发布于 2018-09-24 13:02:15

另一个重要的区别是:

代码语言:javascript
复制
void *ptr = NULL;
HeapFree(GetProcessHeap(), 0, ptr);

未定义行为,而

代码语言:javascript
复制
void *ptr = NULL;
free(ptr);

定义良好(不执行手术)。

更新2021:

HeapFree documentation 已更新于2021年1月发布,现在声明:

[in] lpMem 指向要释放的内存块的指针。此指针由HeapAlloc或HeapReAlloc函数返回。这个指针可以是

老实说,目前还不清楚这是否适用于特定的SDK版本,还是从任何时候开始。可以肯定,该参数已经在10.0.16299.0上用_Frees_ptr_opt_标记,因此可能只是文档问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4588660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档