這裡的 heap 管理不是指 console 的 new、malloc 等方式,而是用 win32 api 方式管理;相關的 API 非常多,資料都是從 MSDN 找下來的,有興趣到 MSDN 看更多。
1. 建立 heap
HANDLE WINAPI HeapCreate(
__in DWORD flOptions, // 如下說明
__in SIZE_T dwInitialSize, // heap 大小
__in SIZE_T dwMaximumSize // heap 最大值
);
flOptions
HEAP_CREATE_ENABLE_EXECUTE 分配記憶體允許用於程式碼執行
HEAP_GENERATE_EXCEPTION 若失敗產生異常,不返回 NULL
HEAP_NO_SERIALIZE 不進行連續存取
2. 取得 heap
HANDLE WINAPI GetProcessHeap(void);
DWORD WINAPI GetProcessHeaps(
__in DWORD NumberOfHeaps, // ProcessHeaps 能存 handle 之個數
__out PHANDLE ProcessHeaps // 儲存 process 中所有 heap
);
傳回 heap 個數,若傳回0代表失敗。
3. 指定 heap 分配記憶體
LPVOID WINAPI HeapAlloc(
__in HANDLE hHeap, // 從此 heap 進行分配
__in DWORD dwFlags,
__in SIZE_T dwBytes // 欲分配 heap 大小
);
dwFlags
HEAP_GENERATE_EXCEPTIONS : 分配錯誤丟出異常
HEAP_NO_SERIALIZE: 不使用連續存取
HEAP_ZERO_MEMORY: 將分配記憶體內容清為0
失敗傳回 NULL,成功傳回 LPVOID 資料。
4. 指定 heap 重新分配記憶體
LPVOID WINAPI HeapReAlloc(
__in HANDLE hHeap, // 從此 heap 重新分配
__in DWORD dwFlags, // 與上述同
__in LPVOID lpMem, // 原 heap 位置
__in SIZE_T dwBytes // 重新調整後大小
);
失敗傳回 NULL,成功傳回 LPVOID 資料。
5. heap 釋放
BOOL WINAPI HeapFree(
__in HANDLE hHeap, // 欲釋放之 heap handle
__in DWORD dwFlags, // 設置參數,MSDN 上只提供 HEAP_NO_SERIALIZE
__in LPVOID lpMem // 要釋放之 pointer
);
HeapFree 是拿來釋放 HeapAlloc 和 HeapReAlloc 配出來的 heap
BOOL WINAPI HeapDestroy(
__in HANDLE hHeap // 要釋放的 head handle
);
HeapDestroy 是釋放 HeapCreate 所建立的 heap
6. 取得 help 大小
SIZE_T WINAPI HeapSize(
__in HANDLE hHeap, // heap handle
__in DWORD dwFlags, // 通常設 HEAP_NO_SERIALIZE,見下述
__in LPCVOID lpMem // pointer
);
dwFlags
HEAP_GENERATE_EXCEPTIONS : 分配錯誤丟出異常
HEAP_NO_SERIALIZE: 不使用連續存取
HEAP_ZERO_MEMORY: 將分配記憶體內容清為0
7. struct SYSTEM_INFO
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId; // 已不用
struct {
WORD wProcessorArchitecture; // CPU 系統結構, 下詳述
WORD wReserved; // 保留
} ;
} ;
DWORD dwPageSize; // 分頁大小
LPVOID lpMinimumApplicationAddress; // 程式可取得之最小記憶體位置
LPVOID lpMaximumApplicationAddress; // 程式可取得之最大記憶體位置
DWORD_PTR dwActiveProcessorMask; // CPU之代碼 (第幾顆處理器)
DWORD dwNumberOfProcessors; // CPU數量
DWORD dwProcessorType; // 目前應沒在用
DWORD dwAllocationGranularity; // 略
WORD wProcessorLevel;// 略
WORD wProcessorRevision;// 略
} SYSTEM_INFO;
wProcessorArchitecture
PROCESSSOR_ARCHITECTURE_INTEL
PROCESSSOR_ARCHITECTURE_MIPS
PROCESSSOR_ARCHITECTURE_ALHPA
PROCESSSOR_ARCHITECTURE_UNKNOW