从堆中分配指定的字节数。
语法
DECLSPEC_ALLOCATOR HLOCAL LocalAlloc(
  [in] UINT   uFlags,
  [in] SIZE_T uBytes
);
参数
[in] uFlags
内存分配属性。 默认值为 LMEM_FIXED 值。 此参数可以是以下一个或多个值,但特别指出的不兼容组合除外。
| 值 | 含义 | 
|---|---|
| 
 | 合并 LMEM_MOVEABLE 和 LMEM_ZEROINIT。 | 
| 
 | 分配固定内存。 返回值是指向内存对象的指针。 | 
| 
 | 分配可移动内存。 内存块永远不会在物理内存中移动,但它们可以在默认堆中移动。 返回值是内存对象的句柄。 若要将句柄转换为指针,请使用 LocalLock 函数。 此值不能与 LMEM_FIXED组合使用。 | 
| 
 | 将内存内容初始化为零。 | 
| 
 | 合并 LMEM_FIXED 和 LMEM_ZEROINIT。 | 
| 
 | 与 LMEM_MOVEABLE 相同。 | 
| 
 | 与 LMEM_FIXED 相同。 | 
以下值已过时,但提供这些值是为了与 16 位 Windows 兼容。 它们将被忽略。
- LMEM_DISCARDABLE
- LMEM_NOCOMPACT
- LMEM_NODISCARD
[in] uBytes
要分配的字节数。 如果此参数为零且 uFlags 参数指定 LMEM_MOVEABLE,则函数将返回标记为已丢弃的内存对象的句柄。
返回值
如果函数成功,则返回值是新分配的内存对象的句柄。
如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。
注解
Windows 内存管理不提供单独的本地堆和全局堆。 因此, LocalAlloc 和 GlobalAlloc 函数实质上是相同的。
可移动内存标志 LHND、 LMEM_MOVABLE 和 NONZEROLHND 会增加不必要的开销,并要求安全使用锁定。 除非文档明确指出应使用它们,否则应避免使用它们。
除非文档特别指出应使用本地函数,否则新应用程序应使用 堆 函数。 例如,某些 Windows 函数分配必须使用 LocalFree 释放的内存。
如果堆不包含满足请求的足够可用空间, 则 LocalAlloc 返回 NULL。 由于 NULL 用于指示错误,因此永远不会分配虚拟地址 0。 因此,很容易检测到 NULL 指针的使用。
如果 LocalAlloc 函数成功,它将至少分配请求的量。 如果分配的金额大于请求的金额,则进程可以使用整个金额。 若要确定实际分配的字节数,请使用 LocalSize 函数。
若要释放内存,请使用 LocalFree 函数。 使用 GlobalFree 释放通过 LocalAlloc 分配的内存是不安全的。
示例
以下代码演示 了 LocalAlloc 和 LocalFree 的简单用法。
#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);
}
要求
| 要求 | 值 | 
|---|---|
| 最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] | 
| 最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] | 
| 目标平台 | Windows | 
| 标头 | winbase.h (包括 Windows.h) | 
| Library | Kernel32.lib | 
| DLL | Kernel32.dll |