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"));
        }
    }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部