MSDN 介绍:Global 函数相比于其它的内存分配函数来说有更大的开销,同时其提供了更少的功能。更建议使用heap 系列的函数进行内存管理。另外,当前Global*** 函数的主要应用场景为:DDE(动态数据交换),剪贴板,OLE 数据对象。其它情况下还是使用Heap 系列的内存管理函数比较好。如果想执行动态生成的代码,需要使用VirtualAlloc 申请内存,然后VirtualProtect 函数赋予PAGE_EXECUTE权限。
GlobalAlloc
函数描述
GlobalAlloc 函数从堆中申请指定大小的内存。
HGLOBAL WINAPI GlobalAlloc(
_In_ UINT uFlags,
_In_ SIZE_T dwBytes
);
参数
uFlags,可以是下列标志的任意组合,除非明确规定不可以组合。
Value | Meaning |
GHND 0x0042 | GMEM_MOVEABLE|GMEM_ZEROINIT |
GMEM_FIXED | 申请已经提交的内存,返回值是一个内存指针 |
GMEM_MOVEABLE 0x0002 | 申请可移动的内存,内存块对应的物理内存位置不变,但是 它们可以在默认的堆中移动,即映射在不同的地址 返回值是一个内存对象的句柄,使用GlobalLock 函数将此句柄 转化为一个指针。不可以与GMEM_FIXED 标志组合。 |
GMEM_ZEROINIT | 初始化内存内容为0 |
GPTR | GMEM_FIXED|GMEM_ZEROINIT |
dwBytes
8 字节对齐
返回值
失败返回NULL
成功的时候,函数返回的内存大小 >= 申请的内存大小,通过GlobalSize 可以判断当前申请的内存的大小。
注
Windows 内存管理不提供单独的本地堆和全局堆。因此,GlobalAlloc 和 LocalAlloc 函数本质是相同的。
注意:
GlobalFree
函数描述
释放特定的全局内存对象,并废除该句柄
HGLOBAL WINAPI GlobalFree( _In_ HGLOBAL hMem );
参数
hMem
GlobalAlloc 或者 GlobalReAlloc 的返回值。
返回值
成功返回NULL。
注
GlobalAlloc 将释放一个加锁的全局内存对象。在Debug 模式下, 如果释放加锁的对象将触发一个断点。通过GlobalFlags函数可以查看对象的锁的个数。
GlobalLock
函数描述
锁定一个管局内存对象并返回这个对象的内存块的第一个字节的地址。
LPVOID WINAPI GlobalLock( _In_ HGLOBAL hMem );
参数
hMem
全局内存对象的句柄,由GlobalAlloc 或者 GlobalReAllloc 返回。
返回值
成功返回这个对象的内存块的第一个字节的地址,失败返回NULL
注
每个内存对象结构有一个锁计数,初始为0,每一个可移动的内存对象,GlobalLock 使其锁计数+1,GlobalUnlock 使其-1。进程对GlobalLock 进行的成功调用必须有一个对应的GlobalUnlock 被调用。锁定的内存不能被移动或者丢弃,除非通过使用GlobalReAlloc 函数重新分配内存对象。锁定的内存对象的内存块一直保持到它的锁计数为0,此时,此内存块可以被移动或者被释放。
GlobalUnlock
函数描述
解锁一个申请时带有GMEM_MOVABLE 属性的内存对象。对于GMEM_FIXED 申请的内存对象没有影响。
BOOL WINAPI GlobalUnlock( _In_ HGLOBAL hMem );
参数
hMem
全局内存对象的句柄,由GlobalAlloc 或者 GlobalReAllloc 返回。
返回值
如果调用之后内存对象依然是锁定的,返回非0值,如果解除锁定,函数返回0,GetLastError 返回NO_ERROR,失败,返回0,GetLastError 返回非NO_ERROR 值。
注
如果内存对象已经解锁了,GlobalUnlock 返回FALSE,GetLastError 返回ERROR_NOT_LOCKED.
GlobalReAlloc
函数描述
丢弃指定的全局内存对象,锁计数必须为0.
HGLOBAL WINAPI GlobalDiscard( [in] HGLOBAL hMem );
参数
hMem
全局内存对象的句柄,由GlobalAlloc 或者 GlobalReAllloc 返回。
返回值
成功的话,返回值是一个内存对象的句柄。
失败,返回值为NULL。
注
虽然GlobalDiscard 丢弃对象的内存块,但对象的句柄仍然有效。该过程可以随后将句柄传给GlobalReAlloc 函数,以分配由相同句柄标识的另一个全局内存块。