我正在使用WinAPI的HeapAlloc()函数来分配内存,我想在代码中的其他地方找到它的大小。我需要自己记录一下尺寸吗?还是有别的办法?
发布于 2016-09-04 16:02:21
HeapAlloc将分配数舍入到最近的对齐。如果您要求2字节,它将给您至少两个字节,但可能给您更多。正如文献资料所说:
如果HeapAlloc函数成功,它至少会分配请求的内存量。
HeapAlloc使用的特定对齐没有文档化,但如果我没记错的话,所有的HeapAlloc都在32位x86上使用8字节对齐,在64位x86上使用16字节对齐。这篇旧的知识库文章用我的记忆摇摆。当然,由于它没有明确的文档化,并且可能在未来版本的Windows和/或不同的体系结构上发生更改,所以您不应该依赖硬编码的对齐值。
但是,如果这些函数确实分配了比请求更多的内存,调用方就可以自由地使用所有的内存。要确定分配的实际大小,请调用HeapSize函数。一段时间前,陈雷蒙德在博客上提到了这一点。。
所以你所看到的行为实际上是有意义的,尽管你正在用完全错误的方式做出决定。正如注释中已经指出的,sizeof没有告诉您分配的大小。你需要HeapSize来做这件事。sizeof告诉您的是编译时元素matches[lastMeal]的大小,由于对齐的原因,元素的大小也是8字节而不是2字节。
至于您的编辑:最佳实践是自己跟踪这些信息。无论何时传递指针,都要传递分配的大小。请注意,这应该是分配的预期大小(您要求的2字节),而不是分配的实际大小( Heap Manager为内部对齐考虑返回的8字节)。当您通过调用HeapFree来释放内存时,它知道实际分配的大小,并将在必要时释放它。但是,客户端代码无法确定最初请求的分配的大小,这就是为什么需要自己跟踪它的原因。
https://stackoverflow.com/questions/39318734
复制相似问题