GlobalAlloc全局内存的使用
生活随笔
收集整理的這篇文章主要介紹了
GlobalAlloc全局内存的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? GlobalAlloc()是16位WINDOWS程序使用的API,返回一個內存句柄,在實際需要使用時,用GlobalLock()來實際得到內存區。但,32位WINDOWS系統中,應使用新的內存分配函數HeapAlloc()以得到更好的支持,GlobalAlloc()還可以用,主要是為了兼容。
? // TODO: 在此添加控件通知處理程序代碼
?? ?/*?? ?GlobalAlloc申請的內存分兩種,一種是GMEM_FIXED,另一種是GMEM_MOVEABLE。兩者的差別只要在于GMEM_MOVEABLE類型的內存操作系統是可以移動的,比如堆中有好幾塊小內存,
?? ?當再申請一大塊內存時,操作系統會移動GMEM_MOVEABLE類型的內存來合并出一大塊。正因為GMEM_MOVEABLE是可移動的,所以要用句柄標識,不能用內存地址標識,
?? ?在使用時通過GlobalLock由句柄得到內存地址。對于GMEM_FIXED類型的,該函數返回的句柄就是內存指針,可以直接當內存指針使用
?? ?GMEM_FIXED?????? 分配一個固定內存塊
?? ?GMEM_MOVEABLE??? 分配一個可移動內存塊
?? ?GMEM_DISCARDABLE 分配一個可丟棄內存塊
?? ?GMEM_NOCOMPACT?? 堆在這個函數調用期間不進行累積
?? ?GMEM_NODISCARD?? 函數調用期間不丟棄任何內存塊
?? ?GMEM_ZEROINIT??? 新分配的內存塊全部初始化成零
?? ?*/
?? ?HGLOBAL gMem=GlobalAlloc(0,1024);
?? ?if (gMem==NULL)
?? ?{
?? ??? ?AfxMessageBox(_T("GlobalAlloc"));
?? ??? ?return;
?? ?}
?? ?int gMemSize=GlobalSize(gMem);
?? ?if (0==gMemSize)
?? ?{
?? ??? ?AfxMessageBox(_T("GlobalSize"));
?? ??? ?return;
?? ?}
?? ?/*GlobalLock:鎖定內存中指定的內存塊,并返回一個地址值,令其指向內存塊的起始處。
?? ?一般情況下我們在編程的時候,給應用程序分配的內存都是可以移動的或者是可以丟棄的,
?? ?這樣能使有限的內存資源充分利用,所以,在某一個時候我們分配的那塊內存的地址是不確定的,因為他是可以移動的,所以得先鎖定那塊內存塊,
?? ?這兒應用程序需要調用API函數GlobalLock函數來鎖定句柄。
?? ?*/
?? ?DWORD *pGlobalLockAddr;
?? ?pGlobalLockAddr=(DWORD*)GlobalLock(gMem);
?? ?if (pGlobalLockAddr==NULL)
?? ?{
?? ??? ?AfxMessageBox(_T("GlobalLock"));
?? ??? ?return;
?? ?}
?? ?BOOL bGlobalUnlock=GlobalUnlock(gMem);
?? ?if (!bGlobalUnlock)
?? ?{
?? ??? ?AfxMessageBox(_T("GlobalUnlock"));
?? ??? ?return;
?? ?}
?? ?HGLOBAL gNewMem=GlobalReAlloc(gMem,2048,GMEM_ZEROINIT);
?? ?if (gMem!=NULL)
?? ?{
?? ??? ?if (!GlobalFree(gMem))
?? ??? ?{
?? ??? ??? ?AfxMessageBox(_T("GlobalFree"));
?? ??? ?}
?? ?}
?? ?if (gNewMem!=NULL)
?? ?{
?? ??? ?if (!GlobalFree(gNewMem))
?? ??? ?{
?? ??? ??? ?AfxMessageBox(_T("GlobalFree"));
?? ??? ?}
?? ?}
總結
以上是生活随笔為你收集整理的GlobalAlloc全局内存的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC使用HTTP协议下载文件
- 下一篇: 关于WM_NCHITTEST消息