創建堆 HeapCreate


創建額外的堆的原因
1.對組件進行保護
2.更有效的內存管理
3.局部訪問
4.避免線程同步開銷
5.快速釋放


HeapCreate函數原型:
HANDLE WINAPI HeapCreate(
_In_ DWORD  flOptions,
_In_ SIZE_T dwInitialSize,
_In_ SIZE_T dwMaximumSize

);

第一參數 flOptions 表示對堆的操作如何進行,可以是0,HEAP_NO_SERIALIZE,HEAP_GENERATE_EXCEPTIONS,HEAP_CREATE_ENABLE_EXECUTE。
默認情況下,對堆的訪問會依次進行,多個線程會從同一個堆中分配釋放內存,堆數據不被破壞。
但在多線程情況下,要盡量避免使用HEAP_NO_SERIALIZE。如果想在堆中放可執行代碼,必須使用 HEAP_CREATE_ENABLE_EXECUTE。
第二參數dwInitialSize表示開始時分給堆的字節數。
第三參數dwMaximumSize表示所能增長到的最大大小,如果指定為0的話,則堆可以在需要的情況下不斷增大。

從堆里分配內存塊,只需調用HeapAlloc()函數
LPVOID
WINAPI
HeapAlloc(
_In_ HANDLE hHeap,
_In_ DWORD dwFlags,
_In_ SIZE_T dwBytes
);
這里說一下第三參數,用來指定一些標志,會對分配結果產生影響。目前只支持這三個參數,HEAP_ZERO_MEMORY,HEAP_GENERATE_EXCEPTIONS,HEAP_NO_SERIALIZE。

HEAP_ZERO_MEMORY是把內存清空,

HEAP_GENERATE_EXCEPTIONS告訴系統,如果沒有足夠的空間,就拋出異常,
HEAP_NO_SERIALIZE用來強制系統不要把這次分配結果與其他線程的訪問排列起來,有可能破壞堆的完整性。

在分配大於1MB 的內存時,建議使用VirtualAlloc 函數。

低碎片堆
如果產生了內存碎片,我們可以強制操作系統使用低碎片堆的算法,《Windows核心編程》上舉了一個例子,

VOID Sub_1()
{
HANDLE hCHeap = GetProcessHeap();
WCHAR buf[10] = { 0 };
ULONG ulHeapCompatibilityInformation;
ulHeapCompatibilityInformation = 2;
if (HeapSetInformation(hCHeap, HeapCompatibilityInformation, &ulHeapCompatibilityInformation,
sizeof(ulHeapCompatibilityInformation)))
{
wprintf(L"Heap algorithm set to %s Low-fragmentation heap(handle=0x%x)\n", buf[0], hCHeap);
}
else
{
wprintf(L"Unable to set Heap information to %s (handle=0x%x)GetLastError()= %d 0x%x\n",
buf[0], hCHeap, GetLastError(), GetLastError());
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM