關於堆棧(2)

創建輔助堆棧:
HANDLE HeapCreate(
DWORD flOptions, // heap allocation attributes
SIZE_T dwInitialSize, // initial heap size
SIZE_T dwMaximumSize // maximum heap size
);
flOptions:0,HEAP_GENERATE_EXCEPTIONS,HEAP_NO_SERIALIZE
0表示默認設置,堆棧會順序訪問它自己
HEAP_NO_SERIALIZE:多個線程可以同時訪問堆棧,沒有把握的情況下,最好不要使用該標誌,會造成堆棧數據的破壞
HEAP_GENERATE_EXCEPTIONS:在分配或者重新分配堆棧的內存嘗試失敗時,會引發一個異常條件
dwInitialSize:堆棧最初提交到物理存儲器的內存大小,如果填入的數值不是CPU頁面大小的倍數,HeapCreate會將這個函數圓整爲CPU頁面大小的倍數
dwMaximumSize:堆棧的最大大小,如果設置爲0,表示沒有上限

在堆棧中分配內存
LPVOID HeapAlloc(
HANDLE hHeap, // handle to private heap block
DWORD dwFlags, // heap allocation control
SIZE_T dwBytes // number of bytes to allocate
);
hHeap:HeapCreate返回的堆棧句柄
dwFlags:可以使用的標誌有0,HEAP_GENERATE_EXCEPTIONS,HEAP_NO_SERIALIZE,HEAP_ZERO_MEMORY,前面3個就不講了,HEAP_ZERO_MEMORY表示用0填充內存
dwBytes:你想要分配的內存字節數

改變內存大小
LPVOID HeapReAlloc(
HANDLE hHeap, // 堆棧句柄
DWORD dwFlags, // heap reallocation options
LPVOID lpMem, // 想要改變大小的內存地址
SIZE_T dwBytes // 想要分配的字節數
);
dwFlags:除了HeapAlloc可以使用的標誌之外還有一個HEAP_REALLOC_IN_PLACE_ONLY,這個標誌告訴函數,當內存擴大時,不移動內存塊

獲取內存塊的大小
DWORD HeapSize(
HANDLE hHeap,
DWORD dwFlags, //0或者HEAP_NO_SERIALIZE
LPCVOID lpMem // 想要獲取大小的內存地址的指針
);

釋放內存塊
BOOL HeapFree(
HANDLE hHeap,
DWORD dwFlags, //0或者HEAP_NO_SERIALIZE
LPVOID lpMem // 想要釋放的內存的地址
);

撤銷堆棧
BOOL HeapDestroy(
HANDLE hHeap
);

如果進程中含有多個堆棧,可以用這個函數獲取多個堆棧的句柄
DWORD GetProcessHeaps(
DWORD NumberOfHeaps, // 堆棧句柄數組的最大容量
PHANDLE ProcessHeaps // 堆棧句柄數組
);

驗證堆棧的完整性
BOOL HeapValidate(
HANDLE hHeap, //
DWORD dwFlags, // 只能爲0或者HEAP_NO_SERIALIZE
LPCVOID lpMem // 如果這個參數爲NULL,就驗證整個堆棧的完整性,否則就驗證某塊內存的有效性
);

合併地址中的空閒內存塊,收回不包含已經分配的內存塊的物理存儲器頁面
UINT HeapCompact(
HANDLE hHeap,
DWORD dwFlags // 只能爲0或者HEAP_NO_SERIALIZE
);

鎖定堆棧
BOOL HeapLock(HANDLE hHeap);
BOOLHeapUnLock(HANDLE hHeap);
這兩個函數時用於線程同步的,當某個線程調用了HeapLock函數時,該線程就成爲了這個堆棧的擁有者,其他線程一旦調用就會進入暫停狀態,直到使用HeapUnLock

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章