原文链接 -> 传送门
函数功能:
LocalAlloc 函数用于从堆中分配指定大小的字节数。
注释:与其他内存管理函数相比,局部内存管理函数有更大的开销却提供更少的功能。除非指出使用局部内存管理函数,不然新的应用程序应该使用堆内存管理函数。更多信息,查阅 Global and Local Functions。
API 函数原型:
注释:_In_ 说明该参数是输入的。
HLOCAL WINAPI LocalAlloc( _In_ UINT uFlags, _In_ SIZE_T uBytes );
参数解析:
|
参数 |
含义 |
||||||||||||||||
|
uFlags |
1. 指定如何分配内存。默认的是 LMEM_FIXED 标识
· LMEM_DISCARDABLE · LMEM_NOCOMPACT · LMEM_NODISCARD |
||||||||||||||||
|
uBytes |
1. 指定要申请的字节数 |
返回值:
1. 如果函数调用成功,返回一个新分配的内存对象的句柄;
2. 如果函数调用失败,返回值为 NULL。
若想获得更多的错误信息,请调用 GetLastError 函数。
备注:
1. 内存管理器并不提供相互分开的局部堆和全局堆。因此,GlobalAlloc 函数和 LocalAlloc 函数本质上是相同的。
2. 使用 LHND、LMEM_MOVABLE 和 NONZEROLHND 会添加不必要的开销且需要上锁才可以安全的使用。除非特别说明应该使用它们,不然应该避免使用。
3. 除非特别指出使用局部内存管理函数,不然新的应用程序应该使用堆内存管理函数分配管理内存。例如一些函数分配的内存必须使用 LocalFree 函数释放。
4. 如果堆中没有充足的空闲空间去满足我们的请求,LocalAlloc 返回 NULL。因为 NULL 是用于标明错误,所以不会分配虚拟地址 0。因此很容易检测出是否在使用一个 NULL 指针。
5. 如果 LocalAlloc 函数调用成功,至少会分配用户请求的内存大小。如果实际分配的内存大小大于请求的内存大小,分配的内存都可以使用。使用 LocalSize 函数获取实际分配的内存大小,单位字节。
6. 使用 LocalFree 函数释放内存。使用 GlobalFree 函数释放 LocalAlloc 函数分配的内存不是一个安全的做法。
例子:
下边代码演示了 GlobalAlloc 函数和 GlobalFree 函数简单使用
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _cdecl _tmain()
{
LPTSTR pszBuf=NULL;
pszBuf = (LPTSTR)LocalAlloc(
LPTR,
MAX_PATH*sizeof(TCHAR));
// Handle error condition
if( pszBuf == NULL )
{
_tprintf(TEXT("LocalAlloc failed (%d)\n"), GetLastError());
return;
}
//see how much memory was allocated
_tprintf(TEXT("LocalAlloc allocated %d bytes\n"), LocalSize(pszBuf));
// Use the memory allocated
// Free the memory when finished with it
LocalFree(pszBuf);
}
需求:
|
Minimum supported client |
Windows xp [仅桌面应用程序] |
|
Minimum supported server |
Windows 2003 服务器版 [仅桌面应用程序] |
|
Header |
WinBase.h (包含于 Windows.h) |
|
Library |
Kernel32.lib |
|
DLL |
Kernel32.dll |




