【轉帖】關於GlobalAlloc,GlobalLock,GlobalUnLock的理解

關於GlobalAlloc,GlobalLock,GlobalUnLock

調用GlobalAlloc函數分配一塊內存,該函數會返回分配的內存句柄。
調用GlobalLock函數鎖定內存塊,該函數接受一個內存句柄作爲參數,然後返回一個指向被鎖定的內存塊的指針。 您可以用該指針來讀寫內存。
調用GlobalUnlock函數來解鎖先前被鎖定的內存,該函數使得指向內存塊的指針無效。
調用GlobalFree函數來釋放內存塊。您必須傳給該函數一個內存句柄。

GlobalAlloc
說明
分配一個全局內存塊
返回值
Long,返回全局內存句柄。零表示失敗。會設置GetLastError
參數表
參數 類型及說明
wFlags Long,對分配的內存類型進行定義的常數標誌,如下所示:
             GMEM_FIXED 分配一個固定內存塊
             GMEM_MOVEABLE 分配一個可移動內存塊
             GMEM_DISCARDABLE 分配一個可丟棄內存塊
             GMEM_NOCOMPACT 堆在這個函數調用期間不進行累積
             GMEM_NODISCARD 函數調用期間不丟棄任何內存塊
             GMEM_ZEROINIT 新分配的內存塊全部初始化成零
dwBytes Long,要分配的字符數
註解
如指定了 GMEM_FIXED,那麼返回值就是要使用的實際內存地址即指針(GlobalLock 會返回同樣的值)——所以在使用固定內存塊的時候不需要執行一個 GlobalLock/GlobalUnlock 操作
由於 Win32 採用了高級的內存管理方案,所以使用可移動的內存塊並沒有什麼好處
用這個函數分配的內存塊允許在8位邊界以內
【附】關於GlobalAlloc的問題
--------------------------------------------------------------------------------
問:在使用 GlobalAlloc 分配一個全局內存塊時,使用GMEM_FIXED分配一個固定內存塊與使用GMEM_MOVEABLE分 配一個可移動內存塊到底有什麼不同?(請 具 體 點)
其效率上是否也存在差異?
爲什麼在有些源碼中,再使用GMEM_MOVEABLE標誌分配內存時,將使用GlobalFree對其返回的內存句柄進行釋放操作的語句註釋掉,或者乾脆就不寫?難道是不需要這麼做嗎?
--------------------------------------------------------------------------------
答:GMEM_MOVEABLE是允許操作系統(或者應用程序)實施對內存堆的管理,在必要時,操作系統可以移動內存塊獲取更大的塊,或者合併一些空閒的內存塊,也稱“垃圾回收”,它可以提高內存的利用率。一般情況下,內存堆空間是由用戶來管理的,windows操作系統不干預。如果存在下列情況,即堆中有10個1K的空閒塊,這時如果直接申請一個5K的內存空間,會得到不成功的信息。但如果其它已經被佔用的內存塊是movable,這時系統就可以移動這些內存塊,合併出一個5k的內存塊,併成功分配給用戶使用。它的空間效率是以運行時的時間效率爲代價的。

GlobalLock
函數功能描述:鎖定一個全局的內存對象,返回指向該對象的第一個字節的指針
函數原型:
LPVOID GlobalLock( HGLOBAL hMem )
參數:
hMem:全局內存對象的句柄。這個句柄是通過GlobalAlloc或GlobalReAlloc來得到的
返回值:
調用成功,返回指向該對象的第一個字節的指針
調用失敗,返回NULL,可以用GetLastError來獲得出錯信息
注意:
調用過GlobalLock鎖定一塊內存區後,一定要調用GlobalUnlock來解鎖。

GlobalUnlock
函數功能描述:解除被鎖定的全局內存對象
函數原型:BOOL GlobalUnlock( HGLOBAL hMem );
參數:hMem:全局內存對象的句柄
返回值:
非零值,指定的內存對象仍處於被鎖定狀態
0,函數執行出錯,可以用GetLastError來獲得出錯信息,如果返回NO_ERROR,則表示內存對象已經解鎖了
注意:    這個函數實際上是將內存對象的鎖定計數器減一,如果計數器不爲0,則表示執行過多個GlobalLock函數來對這個內存對象加鎖,需要對應數目的GlobalUnlock函數來解鎖。
    如果通過GetLastError函數返回錯誤碼爲ERROR_NOT_LOCKED,則表示未加鎖或已經解鎖。

示例:
// Malloc memory
hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, nSize);
// Lock memory
pMem = (BYTE *) GlobalLock(hMem);
..................
// Unlock memory
GlobalUnlock(hMem);

 

文章來源:http://hi.baidu.com/diqiucun666/blog/item/879fbe0112201a001d958351.html

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