如果它在本地堆上分配,为什么称它为Marshal.AllocHGlobal?

Pol*_*ial 5 c# winapi memory-management marshalling

从MSDN文档Marshal.AllocHGlobal:

AllocHGlobal是Marshal类中的两种内存分配方法之一.此方法从Kernel32.dll公开Win32 LocalAlloc函数.

考虑到有一个GlobalAlloc API在全局堆上而不是本地堆上分配内存,这个方法的名称不是误导吗?

是否有理由将其命名AllocHGlobal,而不是AllocHLocal

更新: Simon在评论中指出,Windows中不再存在全局堆这样的东西,并且这些GlobalAllocLocalAllocAPI仅用于遗留目的.这些天,GlobalAllocAPI不再是一个包装器了LocalAlloc.

这解释了为什么API根本不调用GlobalAlloc,但它没有解释为什么API在AllocHGlobal没有(不能)使用全局堆时也被命名,甚至也没有调用GlobalAlloc.命名不可能是出于遗留原因,因为在删除16位支持之后,直到.NET 2.0才会引入命名.所以,问题仍然存在:为什么Marshal.AllocHGlobal如此误导性地命名?

arx*_*arx 3

假设您正在使用拖放或通过剪贴板在应用程序之间进行数据传输。要填充该STGMEDIUM结构,您需要一个HGLOBAL. 所以你打电话AllocHGlobal。由此得名。

该函数的主要用途是与需要HGLOBAL. 如果它被称为其他任何名称,将会令人困惑,因为当您想要一个时,HGLOBAL您必须找到一些文档来告诉您AllocAnythingElse产生了一个可以用作 的值HGLOBAL