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