HeapAlloc函数从堆中分配一个内存块。分配的内存不可移动。
LPVOID HeapAlloc(
HANDLE 【hHeap】, | //处理私有堆块 |
DWORD 【dwFlags中】, | //堆分配控制标志 |
DWORD 【dwBytes】 | //要分配的字节数 |
); |
参数
【hHeap】
指定将从其分配内存的堆。此参数是由HeapCreate或GetProcessHeap函数返回的句柄。
【dwFlags中】
指定堆分配的几个可控方面。指定任何这些标志将覆盖使用HeapCreate创建堆时指定的相应标志。您可以指定以下一个或多个标志:
旗 | 含义 |
HEAP_GENERATE_EXCEPTIONS | 指定操作系统将引发异常以指示功能故障,例如内存不足情况,而不是返回NULL。 |
HEAP_NO_SERIALIZE | 指定在此函数访问堆时不会使用互斥。有关HEAP_NO_SERIALIZE的更多信息,请参阅HeapCreate的备注部分。 |
HEAP_ZERO_MEMORY | 指定分配的内存将被初始化为零。 |
【dwBytes】
指定要分配的字节数。
如果【hHeap】参数指定的堆是“不可生长”堆,则dwBytes必须小于0x7FFF8。通过使用非零值调用HeapCreate函数来创建一个不可扩展的堆。
返回值
如果函数成功,则返回值是指向分配的内存块的指针。
如果函数失败,并且尚未指定HEAP_GENERATE_EXCEPTIONS,返回值为NULL。
如果函数失败,并指定了HEAP_GENERATE_EXCEPTIONS,该函数可能会产生以下异常:
值 | 含义 |
STATUS_NO_MEMORY | 由于缺少可用的内存或堆损坏,分配尝试失败。 |
STATUS_ACCESS_VIOLATION | 由于堆损坏或不正确的功能参数,分配尝试失败。 |
请注意,堆损坏可能导致任何异常。这取决于堆腐败的性质。
如果该函数失败,则不会调用SetLastError.应用程序无法调用GetLastError扩展错误信息。
备注
如果HeapAlloc成功,则至少分配所请求的内存量。如果分配的实际数量大于请求的数量,则该过程可以使用全部金额。要确定分配块的实际大小,请使用HeapSize功能。
要释放HeapAlloc分配的内存块,请使用HeapFree功能。
由HeapAlloc分配的内存不可移动。由于内存不可移动,堆可能会碎片化。
请注意,如果未指定HEAP_ZERO_MEMORY,则分配的内存将不会初始化为零。
也可以看看
GetProcessHeap, HeapCreate, HeapDestroy, HeapFree, HeapReAlloc, HeapSize, SetLastError