GlobalAlloc

GlobalAlloc

GMEM_MOVEABLE GMEM_SHARE 這個標識是為與16位Win

函數簡介


GlobalAlloc
該函數從堆中分配一定數目的位元組數.Win32內存管理器並不提供相互分開的局部和全局堆。提供這個函數只是為了與16位的Windows相兼容.

函數原型


HGLOBALGlobalAlloc(
UINT uFlags, // 分配屬性(方式)
DWORD dwBytes // 分配的位元組數
);

參數uFlags


指定如何分配內存,若指定為0,則是默認的GMEM_FIXED.這個值可以是下面其中一個或幾個位標識(那些指明不兼容的組合除外)

標識的含意


GMEM_FIXED
分配固定的內存,返回值是一個指針.
GMEM_MOVEABLE
分配可移動的內存,在Win32中內存塊在物理內存中是不可移動的,但在預設堆中可以. 返回值是該內存對象的句柄,可使用函數 GlobalLock 將該句柄轉換為一個指針.
這個標識不能與 GMEM_FIXED 組合使用.
GPTR 標識 為GMEM_FIXED和GMEM_ZEROINIT組合.
GHND 標識 為GMEM_MOVEABLE 和 GMEM_ZEROINIT的組合.
GMEM_DDESHARE
GMEM_SHARE
這個標識是為與16位Windows兼容而提供的,一些應用程序可使用該標識加強DDE操作的功能因此當內存用於DDE時可使用此標識.
[DDE說明:DDE 是Dynamic Data Exchange 即動態數據交換。是 16 位 Windows 時代實現不同應用程序之間互相交換數據和控制的技術 ]
GMEM_DISCARDABLE 標識
被忽略。這個標識只是為與 16 位 Windows 相兼容而提供的。在 Win32 中你必須顯式地調用函數 GlobalDiscard 以拋棄一塊內存.
這個標識可與 GMEM_FIXED 組合使用.
GMEM_LOWER,GMEM_NOCOMPACT,GMEM_NODISCARD,GMEM_NOT_BANKED,GMEM_NOTIFY
均被忽略. 這個標識只是為與 16 位 Windows 相兼容而提供的.
GMEM_ZEROINIT
將所申請內存初始化為0.
參數dwBytes
指定要申請的位元組數。若該參數為 0 且參數 uFlags 指定為 GMEM_MOVEABLE 則該函數返回一個內存對象的句柄,該內存對象被標識為discarded(可拋棄的).
返回值
若函數調用成功,則返回一個新分配的內存對象的句柄.
若函數調用失敗,則返回 NULL.可調用 GetLastError 以獲得更多錯誤信息.
註解:
如果堆內沒有足夠的空間滿足請求,函數將返回 NULL.因為NULL是用於標明錯誤的,所以不會分配虛擬0地址.
因此很容易檢測出是否在使用一個NULL指針.
使用此函數分配內存可以保證8位元組的邊界。所有的內存均在執行訪問時創建;不需要特別的函數來動態執行所產生的代碼.
若函數調用成功,將至少分配所需內存。若實際分配量超過所需,則內存仍然能夠充分利用之。可用函數 GlobalSize 來確定實際所分配的位元組數.
可使用 GlobalFree 來釋放內存.