HeapAlloc()

来源:互联网 发布:java中电影院售票系统 编辑:程序博客网 时间:2024/05/22 18:21

HeapAlloc

这个函数从一个堆里分配一块内存。分配得到的内存是不可移动的。


LPVOID HeapAlloc( HANDLE hHeap , DWORD dwFlags , DWORD dwBytes);

参数:

hHeap:堆句柄,从该堆分配内存。这个参数是函数 HeapCreate 或 GetProcessHeap 的返回值。

dwFlags:堆分配选项。这里指定的标记将会重写由 HeapCreate 创建堆时指定的标记。

下面给出该参数可以使用的值,你可以指定一个或多个标记。

HEAP_NO_SERIALIZE:可忽略。默认为堆是序列化的。

HEAP_ZERO_MEMERY:指明分配的内存将会被初始化为0 。若不指定内存将不会初始化。

dwBytes:分配的空间大小,单位为Byte。如果这个堆被指定是不可增长的,那么此参数需小于 0x7FFF8 。(PS :好奇怪的大小)

返回值:

成功:指向被分配的内存块的指针。

失败:NULL

如果这个函数失败,将不会调用 SetLastError 函数 。 应用程序不能调用 GetLastError 得到错误信息。

附注:

如果函数调用成功,分配的内存至少是dwBytes参数指定的大小。如果分配的内存较多,进程可以使用所分配的全部。可以使用 Heap 函数获得实际分配的内存块的大小。

使用 HeapFree 函数来释放该函数所分配的内存块。

该函数分配的内存块是不可移动的,由此,堆可能是碎片化的。

序列化确保当两个以上的线程同时从同一个堆里分配或者释放内存块时操作是互斥的。这会有一些系统开销,但当多线程同时操作一个堆的时候这是必须被使用的。

每个堆总有一个临界区从而使存取序列化。每个堆的临界区有保护存取的作用。

An attempt to grab a critical section that is not owned is a fast path operation that incurs little overhead.(企图占据一个不属于自己的临界区是一种有额外开销的快捷操作方法)。这类似于当永远只有一个线程操作一个特定的堆时对这个堆使用HEAP_NO_SERIALIZE标记。

If there is contention for the critical section and therefore the heap, a new thread request to allocate heap space will serialize.(若对临界区存在争执,则新线程分配堆空间的请求将序列化)

(PS:一个线程使用堆时占用临界区,离开时释放,而临界区同一时间只能被一个线程占用,其他线程占用临界区的请求将会被按序列挂起,虽然这样做会使程序有额外的开销——即被挂起的线程,但这样就能保证堆内数据的安全——多个线程不能同时操作堆)

要求:

系统版本:WinCE 1.0以上

头文件:Winbase.h

链接库:Coredll.lib


0 0
原创粉丝点击