全局和本地函数
支持从 16 位代码移植或维护源代码与 16 位 Windows 的兼容性时使用全局和本地函数。 从 32 位 Windows 开始,全局函数和本地函数作为包装函数实现,这些包装函数使用进程默认堆的句柄调用相应的 堆函数 。 因此,全局函数和本地函数比其他内存管理功能具有更大的开销。
堆函数提供的功能和控制比全局函数和本地函数更多。 除非文档专门指出应使用全局或本地函数,否则新应用程序应使用堆函数。 例如,某些 Windows 函数分配必须使用 LocalFree 释放的内存,并且全局函数仍与动态数据交换 (DDE) 、剪贴板函数和 OLE 数据对象一起使用。 有关全局函数和本地函数的完整列表,请参阅 内存管理功能中的表。
Windows 内存管理不提供单独的本地堆和全局堆,就像 16 位 Windows 那样。 因此,全局和本地函数系列是等效的,在它们之间进行选择是个人偏好的问题。 请注意,从 16 位分段内存模型更改为 32 位虚拟内存模型使一些相关的全局和本地函数及其选项变得不必要或毫无意义。 例如,不再存在近指针和远指针,因为本地和全局分配都返回 32 位虚拟地址。
GlobalAlloc 和 LocalAlloc 分配的内存对象位于具有读/写访问权限的专用已提交页中,其他进程无法访问。 将 GlobalAlloc 与 GMEM_DDESHARE 配合使用分配的内存实际上不会像在 16 位 Windows 中那样全局共享。 此值无效,仅可用于兼容性。 需要共享内存用于其他目的的应用程序必须使用文件映射对象。 多个进程可以映射同一文件映射对象的视图,以提供命名的共享内存。 有关详细信息,请参阅 文件映射。
内存分配仅受可用物理内存的限制,包括磁盘上分页文件中的存储。 分配固定内存时, GlobalAlloc 和 LocalAlloc 将返回一个指针,调用进程可以立即使用该指针来访问内存。 分配可移动内存时,返回值是句柄。 若要获取指向可移动内存对象的指针,请使用 GlobalLock 和 LocalLock 函数。
分配的实际内存大小可以大于请求的大小。 若要确定实际分配的字节数,请使用 GlobalSize 或 LocalSize 函数。 如果分配的金额大于请求的金额,则进程可以使用整个金额。
GlobalReAlloc 和 LocalReAlloc 函数更改由 GlobalAlloc 和 LocalAlloc 分配的内存对象的大小或属性。 大小可以增加或减少。
GlobalFree 和 LocalFree 函数释放由 GlobalAlloc、LocalAlloc、GlobalReAlloc 或 LocalReAlloc 分配的内存。 若要放弃指定的内存对象而不使句柄失效,请使用 GlobalDiscard 或 LocalDiscard 函数。 GlobalReAlloc 或 LocalReAlloc 稍后可以使用该句柄来分配与同一句柄关联的新内存块。
若要返回有关指定内存对象的信息,请使用 GlobalFlags 或 LocalFlags 函数。 该信息包括对象的锁计数,并指示对象是可丢弃的还是已被丢弃的。 若要将句柄返回到与指定指针关联的内存对象,请使用 GlobalHandle 或 LocalHandle 函数。
相关主题