趙麗豔 4313 字 1個月前

◎第三章 內存 內存管理

(2 / 4)
登入後報錯可獲 3天VIP 免廣告——立即登入

特性,其中主要特性有固定的(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

,的定固是以可段,似類很理管的象對存內局全和理管的段


✅ 付款功能已修復,現在可以正常購買了 — 支援信用卡 · Apple Pay · Google Pay · WebATM · ATM 轉帳
😤 廣告總在最入戲的時候跳出來?
月付 $5 USD,升級 VIP 後全站所有頁面廣告立即全關——
不是只有這本書,是整個 oop.tw 每一頁、每一章,從此一路讀到底不被打斷。 $5 USD ≈ 一杯珍奶的錢,換一整個月零廣告清爽閱讀 · 隨時可取消
✅ 全站廣告全關 ✅ 工口專區全本解鎖 ✅ 月卡 $5 USD · 季卡 $13 USD · 年卡 $45 USD
⭐ 登入 / 免費註冊後升級
加我 LINE 好友,分享好書不錯過
第一時間獲得新書推薦、書單更新通知
立即加入
上一頁 書頁/目錄
/ 4 頁
下一頁
為本書評分(每位讀者可評一次,提交後無法修改
發表評論
匿名讀者 身份發表
讀者評論