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