HeapCreate

【勇芳软件工作室】汉化HomePreviousNext

HeapCreate函数创建一个可以由调用进程使用的堆对象。该函数在进程的虚拟地址空间中保留一个连续的块,并为此块的指定初始部分分配物理存储。

HANDLE HeapCreate(

DWORD 【flOptions】,//堆分配标志
DWORD 【dwInitialSize】,//初始堆大小
DWORD 【dwMaximumSize】//最大堆大小
); 

参数

【flOptions】

指定新堆的可选属性。这些标志将通过调用堆函数(HeapAllocHeapFreeHeapReAllocHeapSize)来影响对新堆的后续访问。您可以指定以下一个或多个标志:

含义
HEAP_GENERATE_EXCEPTIONS指定系统将引发异常以指示功能故障,例如内存不足情况,而不是返回NULL。
HEAP_NO_SERIALIZE指定当堆功能从此堆分配和释放内存时不会使用互斥。当未指定HEAP_NO_SERIALIZE标志时出现的默认值是将对堆的访问序列化。堆访问的序列化允许两个或多个线程同时分配并释放来自同一个堆的内存。

【dwInitialSize】

指定堆的初始大小(以字节为单位)。此值确定为堆分配的物理存储的初始量。该值被四舍五入到下一个页边界。要确定主机上的页面大小,请使用GetSystemInfo功能。

【dwMaximumSize】

如果【dwMaximumSize】为非零值,则它指定堆的最大大小(以字节为单位)。HeapCreate功能返回到下一页边界【dwMaximumSize】,然后在进程的虚拟地址空间中保留该块大小的块。如果HeapAllocHeapReAlloc 功能的分配请求超出了【dwInitialSize】指定的初始物理存储量,则系统将为堆分配额外的物理存储页面,直到堆的最大大小。

另外,如果【dwMaximumSize】非零,则堆不能增长,并且绝对限制:堆内存块的最大大小小于0x7FFF8字节。分配较大块的请求将失败,即使堆的最大大小足够大以容纳该块。

如果【dwMaximumSize】为零,则指定堆可以生长。堆的大小仅受可用内存限制。分配大于0x7FFF8字节的块的请求不会自动失败;系统调用VirtualAlloc以获取这种大块所需的内存。需要分配大内存块的应用程序应将【dwMaximumSize】设置为0。

返回值

如果函数成功,返回值是新创建的堆的句柄。

如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.

备注

HeapCreate函数创建一个专用堆对象,调用进程可以通过使用HeapAlloc函数从中分配内存块。初始大小决定了最初分配给堆的已提交页面的数量。最大大小决定保留页面的总数。这些页面在进程的虚拟地址空间中创建一个连续的块,堆可以增长。如果HeapAlloc的请求超过已提交页面的当前大小,则假定物理存储可用,则会从此保留空间自动提交附加页面。

专用堆对象的内存只能由创建它的进程访问。如果动态链接库(DLL)创建一个专用堆,则会在调用该DLL的进程的地址空间中创建该堆,并且该进程只能访问该进程。

系统使用专用堆中的内存来存储堆支持结构,因此并非所有指定的堆大小都可用于进程。例如,如果HeapAlloc函数从最大大小为64K的堆中请求64千字节(K),则由于系统开销,请求可能会失败。

如果未指定HEAP_NO_SERIALIZE标志(简单默认),则堆将在调用进程中序列化访问。当两个或多个线程尝试同时分配或从同一个堆中释放块时,序列化确保互斥。序列化具有小的性能成本,但是必须在多个线程分配并释放同一个堆中的内存时使用它。

设置HEAP_NO_SERIALIZE标志可以消除堆上的互斥。没有序列化,使用相同堆处理的两个或多个线程可能会尝试同时分配或释放内存,可能导致堆中的损坏。因此,HEAP_NO_SERIALIZE标志只能在以下情况下安全使用:

*进程只有一个线程。

*进程有多个线程,但只有一个线程调用特定堆的堆函数。

*该进程有多个线程,应用程序提供自己的机制来互斥特定的堆。

也可以看看

GetProcessHeap, GetProcessHeaps, GetSystemInfo, HeapAlloc, HeapDestroy, HeapFree, HeapReAlloc, HeapSize, HeapValidate, VirtualAlloc