全局函数和本地函数
全局和本地函数支持从 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 函数。
相关主题