HeapCreate()

HeapCreate

這個函數創建一個只有調用進程才能訪問的私有堆。進程從虛擬地址空間裏保留出一個連續的塊並且爲這個塊特定的初始部分分配物理空間。


HANDLE HeapCreate(DWORD flOptions , DWORD dwInitialSize , DWORD dwMaxmumSize);

參數:

flOptions:堆的可選屬性。這些標記影響以後對這個堆的函數操作,函數有:HeapAlloc , HeapFree , HeapReAlloc , HeapSize .

下面給_出在此可以指定的標記:

HEAP_NO_SERIALIAZE:指定當函數從堆裏分配和釋放空間時不互斥(不使用互斥鎖)。當不指定該標記時默認爲使用互斥。序列化允許多個線程操作同一個堆而不會錯誤。這個標記是可忽略的。

HEAP_SHARED_READONLY:這個標記指定這個堆只能由創建它的進程進行寫操作,對其他進程是隻讀的。如果調用者不是可靠的,調用將會失敗,錯誤代碼ERROR_ACCESS_DENIDE 。

註解:爲了使用標記爲HEAP_SHARED_READONLY的堆,運行在kernel mode(核心狀態)是必須的。

dwInitialSize:堆的初始大小,單位爲Bytes。這個值決定了分配給堆的初始物理空間大小。這個值將向上舍入知道下個page boundary(頁界)。若需得到主機的頁大小,使用GetSystemInfo 函數。

dwMaxmumSize:如果該參數是一個非零的值,它指定了這個堆的最大大小,單位爲Bytes。該函數會向上舍入該值直到下個頁界,然後爲這個堆在進程的虛擬地址裏保留舍入後大小的塊。如果函數 HeapAlloc 和 HeapReAlloc 要求分配的空間超過參數 dwInitialSize 指定的大小,系統會分配額外的空間給該堆直到這個堆的最大大小。If dwMaximumSize is nonzero, the heap cannot grow and an absolute limitation arises where all allocations are fulfilled within the specified heap unless there is not enough free space. (如果該參數非零,除非沒有足夠的空間,這個堆總可以增長到該大小)。如果該參數爲零,那麼該堆大小的唯一限制是可用的內存空間。分配大小超過 0x0018000 Bytes的空間總會失敗,因爲獲得這麼大的空間需要系統調用 VirtualAlloc 函數。需要使用大空間的應用應該把該參數設置爲零。

返回值:

成功:一個指向新創建的堆的指針。

失敗:NULL

調用函數 GetLastError 獲得更多的錯誤信息。

附註:

這個函數在調用進程裏創建一個私有堆,進程可調用 HeapAlloc 函數分配內存空間。這些頁在進程的虛擬空間內創建了一個塊,在那裏堆可以增長。

如果 HeapAlloc 函數請求的空間超過了現有的頁大小,如果物理空間足夠的話,額外的空間將會從已保留的空間裏附加。

只有創建私有堆的進程可以訪問私有堆。

如果一個DLL(動態鏈接庫)創建了一個私有堆,那麼這麼私有堆是在調用該DLL的進程的地址空間內,且僅該進程可訪問。

系統會使用私有堆的一部分空間去儲存堆的結構信息,所以,不是所有的堆內空間對進程來說是可用的。例如:HeapAlloc函數從一個最大大小爲 64KB 的堆裏申請 64KB 的空間,由於系統佔用的一部分空間,這個請求通常會失敗。

要求:

系統版本:WinCE 1.0 以上。

頭文件:Winbase.h

鏈接庫:Coredll.lib


發佈了26 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章