首页 > 代码库 > 全局和局部函数
全局和局部函数
全局和局部函数
全局和局部函数是为了支持16bit的程序移植,或者是为了维护程序对16bit Windows的兼容性。从32bit Windows起,全局函数和局部函数的实现是封装一个相关的堆函数,这个堆函数用进程的默认堆的句柄。因此全局和局部函数比其它内存管理函数开销更大。
堆函数比全局和局部函数提供更多的特征和控制。新的程序应该使用堆函数除非文档特别地指出应该使用全局或者局部函数。例如,一些Windows程序必须使用LocalFree来释放分配的内存,并且全局函数在DDE(动态数据交换),剪切板函数,OLE数据对象上依然地被使用。
Windows 内存管理不再像1 6bit Windows那样单独地提供局部堆,全局堆。因此全局和局部的函数族是等价多的,选择哪一个只是个人偏好的问题。注意到从16bit分段存储模式到32bit的虚拟存储模式的变化让许多相关的全局和局部的函数以及它们的选项变得没有必要和无意义。例如,再也没有near points,far points,因为局部和全局的函数都返回一个32bit的虚拟地址。
通过GlobalAlloc和LocalAlloc函数分配的内存对象是私有的,提交页面的读写访问权不能被其它进程获取。用GMEM_DDESHARE标记的GlobalAlloc函数来分配的内存不再像16bit 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。
全局和局部函数