特性,其中主要特性有固定的(LMEM_FIXED),可移動的(LMEM_MOVEABLE)和可刪除的(LMEM_DISCARDABLE)。如果局部堆中無法分配申請的內存,則LocalAlloc函數返回NULL。下麵的代碼用來分配一個固定內存對象,因為局部固定內存對象的對象句柄其本身就是16位內存近地址,因此它可以被應用程序直接存取。
加鎖與解鎖
上麵程序段分配的固定局部內存對象可以由應用程序直接存取,但是,Windows並不鼓勵使用固定內存對象。因此,在使用可移動和可刪除內存對象時,就要經常用到對內存對象的加鎖與解鎖。
不管是可移動對象還是可刪除對象,在它分配後其內存句柄是不變的,它是內存對象的恒定引用。但是,應用程序無法通過內存句柄直接存取內存對象,應用程序要存取內存對象還必須獲得它的近地址,這通過調用LocalLock函數實現。LocalLock函數將局部內存對象暫時固定在局部堆的某一位置,並返回該地址的近地址值,此地址可供應用程序存取內存對象使用,它在應用程序調用LocalUnlock函數解鎖此內存對象之前有效。
應用程序在使用完內存對象後,要儘可能早地為它解鎖,這是因為Windows無法移動被鎖住了的內存對象。當應用程序要分配其它內存時,Windows不能利用被鎖住對象的區域,隻能在它周圍尋找,這會降低Windows內存管理的效率。
改變局部內存對象
局部內存對象分配之後,還可以調用LocalReAlloc函數進行修改。LocalReAlloc函數可以改變局部內存對象的大小而不破壞其內容:如果比原來的空間小,則Windows將對象截斷;如果比原來大,則Windows將增加區域填0(使用LMEM_ZEROINIT選項),或者不定義該區域內容。另外,LocalReAlloc函數還可以改變對象的屬性,如將屬性從LMEM_MOVEABLE改為LMEM_DISCARDABLE,或反過來,此時必須同時指定LMEM_MODIFY選項。但是,LocalReAlloc函數不能同時改變內存對象的大小和屬性,也不能改變具有LMEM_FIXED屬性的內存對象和把其它屬性的內存對象改為LMEM_FIXED屬性。
釋放與刪除
分配了的局部內存對象可以使用LocalDiscard和LocalFree函數來刪除和釋放,刪除和釋放隻有在內存對象未鎖住時才有效。
LocalFree函數用來釋放局部內存對象,當一個局部內存對象被釋放時,其內容從局部堆移走,並且其句柄也從有效的局部內存表中移走,原來的內存句柄變為不可用。LocalDiscard函數用來刪除局部內存對象,它隻移走對象的內容,而保持其句柄有效,用戶在需要時,還可以使用此內存句柄用LocalReAlloc函數重新分配一塊內存。
另外,Windows還提供了函數LocalSize用於檢測對象所占空間;函數LocalFlags用於檢測內存對象是否可刪除,是否已刪除,及其鎖計數值;函數LocalCompact用於確定局部堆的可用內存。
全局內存
全局內存對象在全局堆中分配,全局堆包括所有的係統內存。一般來說,應用程序在全局堆中進行大型內存分配(約大於1KB),在全局堆還可以分配大於64K的巨型內存,這將在後麵介紹。
分配全局內存對象
全局內存對象使用GlobalAlloc函數分配,它和使用LocalAlloc分配局部內存對象很相似。使用GlobalAlloc的例子我們將和GlobalLock一起給出。
請訪問ᴏᴏᴘ.ᴛᴡ獲取最快的章節更新
加鎖與解鎖
全局內存對象使用GlobalLock函數加鎖,所有全局內存對象在存取前都必須加鎖。GlobalLock將對象鎖定在內存固定位置,並返回一個遠指針,此指針在調用GlobalUnlock之前保持有效。
GlobalLock和LocalLock稍有不同,因為全局內存對象可能被多個任務使用,因此在使用GlobalLock加鎖某全局內存對象時,對象可能已被鎖住,為了處理這種情況,Windows增加了一個鎖計數器。當使用GlobalLock加鎖全局內存對象時,鎖計數器加1;使用GlobalUnlock解鎖對象時,鎖計數器減1,隻有當鎖計數器為0時,Windows才真正解鎖此對象。
修改全局內存對象
。述講麵後在將們我點一這,上改修的象對型巨於在處之殊特的象對存內局全改修。述贅再不裡這,似類很數函collAeRlacoL和它,數函collAeRlabolG用使象對存內局全改修
作操它其及放釋存內
。小大存內用可堆局全測檢以可數函tcapmoClabolG;息信等除刪已否是,除刪可否是象對索檢來用數函sgalFlabolG;小大象對存內測檢以可數函eziSlabolG。似類dracsiDlacoL和eerFlacoL與用作其,除刪與放釋來dracsiDlabolG和數函eerFlabolG用使象對存內局全
象對存內型巨
。針指型巨個一回返將象對存內型巨鎖加數函kcoLlabolG用使,象對存內型巨個一是就它那,大更或BK46為小大的象對存內局全果如
,柄句局全的新個一回返象對存內的配分新重為要能可swodniW,時數倍的K46過超並加增小大象對當,性殊特點一有改修的象對存內型巨
紹介段
。係關的段據數和段碼代序程用應與式模存內了明說2.6圖,式模存內的序程用應了定決量數的段據數和段碼代。段據數和段碼代個多有可序程用應個一,種兩段據數和段碼代有段,存內的序程用應理管來念概的段用采swodniW
,的定固是以可段,似類很理管的象對存內局全和理管的段