确定通过HeapAlloc()分配的数组的大小

时间:2016-09-04 15:49:25

标签: c winapi memory memory-management

我正在使用WinAPI的HeapAlloc()函数来分配内存,我想在代码中的其他地方找出它的大小。我是否必须自己跟踪尺寸或有其他方式吗?

1 个答案:

答案 0 :(得分:4)

HeapAlloc将分配汇总到最近的路线。如果你要求2个字节,它将给你至少两个字节,但可能会给你更多。正如the documentation所说:

  

如果HeapAlloc函数成功,它至少分配所请求的内存量。

HeapAlloc使用的特定对齐未记录,但如果我没记错,所有Heap Manager API在32位x86上使用8字节对齐,在64位x86上使用16字节对齐。 This old knowledge base article与我的记忆相吻合。当然,因为它未明确记录并且在将来的Windows版本和/或不同的体系结构中可能会发生变化,所以您不应该依赖于硬编码的对齐值。

但是,如果这些函数确实分配了比请求更多的内存,则调用者 可以自由使用所有内存。要确定分配的实际大小,请调用HeapSize函数。 Raymond Chen blogged about this some time ago

所以你所看到的行为实际上是有道理的,即使你正在以完全错误的方式做出决定。正如评论中已经指出的那样,sizeof并没有告诉你分配的大小。你需要HeapSize才能做到这一点。所有sizeof都告诉您编译时元素matches[lastMeal] 的大小,出于对齐原因, 8个字节而不是2个字节。< / p>

至于您的编辑:最佳做法是自己跟踪此信息。无论何时传递指针,都要传递分配的大小。请注意,这应该是分配的预期大小(您要求的2个字节),而不是分配的实际大小(Heap Manager的8个字节)返回内部对齐考虑因素)。当你通过调用HeapFree释放内存时,它知道实际分配的大小,并在必要时释放它。但是,您的客户端代码无法确定您最初请求的分配大小,这就是您需要自己跟踪它的原因。