原文链接 -> 传送门
函数功能:
GlobalAlloc 函数用于从堆中分配指定大小的字节数。
注意:与其他内存管理函数相比,全部内存管理函数有更大的开销却提供更少的功能。除非指出使用全部内存管理函数,不然新的应用程序应该使用堆内存管理函数。更多信息请查阅 Global and Local Functions。
API 函数原型:
注释:_In_ 说明该参数是输入的。
HGLOBAL WINAPI GlobalAlloc( _In_ UINT uFlags, _In_ SIZE_T dwBytes );
参数解析:
|
参数 |
含义 |
||||||||||||
|
uFlags |
1. 指定如何分配内存。若指定为 0,则是默认的 GMEM_FIXED
· GMEM_DDESHARE · GMEM_DISCARDABLE · GMEM_LOWER · GMEM_NOCOMPACT · GMEM_NODISCARD · GMEM_NOT_BANKED · GMEM_NOTIFY · GMEM_SHARE |
||||||||||||
|
dwBytes |
1. 指定要申请的字节数 |
返回值:
1. 如果函数调用成功,返回一个新分配的内存对象的句柄;
2. 如果函数调用失败,返回值为 NULL。
若想获得更多的错误信息,请调用 GetLastError 函数。
备注:
1. 内存管理器并不提供相互分开的局部堆和全局堆。因此,GlobalAlloc 函数和 LocalAlloc 函数本质上是相同的。
2. 使用 GHND 和 GMEM_MOVABLE 会添加不必要的开销,并且需要上锁才可以安全的使用。除非特别说明应该使用它们,否则应该避免使用。
3. 除非特别指出使用全局内存管理函数,不然新的应用程序应该使用堆内存管理函数。全局内存管理函数仍然使用动态数据交换(DDE),剪切板功能和对象链接嵌入(OLE)数据对象。
4. 如果 GlobalAlloc 函数调用成功,至少会分配用户请求的内存大小。如果实际分配的内存大小大于请求的内存大小,分配的内存都可以使用。使用 GlobalSize 函数获取实际分配的内存大小,单位为字节。
5. 如果堆内没有足够的空间满足请求,GlobalAlloc 函数将返回 NULL。因为 NULL 是用于标明错误,所以不会分配虚拟地址 0。因此很容易检测出是否在使用一个 NULL 指针。
6. 使用此函数分配内存可以保证分配的区域是 8 字节的整数倍。为了动态执行生成的代码,使用 VirtualAlloc 函数分配内存并使用 VirtualProtect 函数授予 PAGE_EXECUTE 访问权限。
7. 使用 GlobalFree 函数释放内存。使用 LocalFree 函数释放 GlobalAlloc 分配的内存并不是一个安全的做法。
例子:
下边代码演示了 GlobalAlloc 函数和 GlobalFree 函数简单使用
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _cdecl main()
{
PSECURITY_DESCRIPTOR pSD;
pSD = (PSECURITY_DESCRIPTOR) GlobalAlloc(
GMEM_FIXED,
sizeof(PSECURITY_DESCRIPTOR));
// Handle error condition
if( pSD == NULL )
{
_tprintf(TEXT("GlobalAlloc failed (%d)\n"), GetLastError());
return;
}
//see how much memory was allocated
_tprintf(TEXT("GlobalAlloc allocated %d bytes\n"), GlobalSize(pSD));
// Use the memory allocated
// Free the memory when finished with it
GlobalFree(pSD);
}
需求:
|
Minimum supported client |
Windows xp [仅桌面应用程序] |
|
Minimum supported server |
Windows 2003 服务器版 [仅桌面应用程序] |
|
Header |
WinBase.h (包含于 Windows.h) |
|
Library |
Kernel32.lib |
|
DLL |
Kernel32.dll |




