非诚勿扰电影2:全局(Global)和局部(Local)内存管理

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 17:19:06

32位windows系统中并没有区分全局堆和局部堆,windows只所以存在全局和局部概念是为了和16位系统兼容.
GlobalAlloc,LocalAlloc函数所分配的内存并没啥区别,比HeapAlloc要慢.不推荐使用.而使用HeapAlloc

1.Global函数
GlobalAlloc,GlobalFree,GlobalReAlloc
GlobalAlloc,GlobalFree是一对分配和释放内存内存函数.
GlobalAlloc函数采用默认堆,不需指定堆句柄,只需指定分配属性与分配的内存大小即可.
Global函数原型如下:
HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
参数uFlags为分配的属性,参数dwBytes为需要分配内存的大小,

HGLOBAL GlobalFree(
HGLOBAL hMem
);

uFlags参数选项
GMEM_FIXED     分配固定内存,返回为指向内存的指针
GMEM_MOVEABLE   可以在堆内移动,地址不固定,返回值指向内存对象句柄.
       GlobalLock函数可以得到固定地址的指针,不能与GMEM_FIXED同时使用
GMEM_ZEROINIT   把分配内存内存清零
GPTR            GMEM_FIXED|GMEM_ZEROINIT
GHND            GMEM_MOVEABLE|GMEM_ZEROINIT

GlobalReAlloc函数的作用是调整GlobalAlloc函数分配的内存大小和属性,函数原型如下:
HGLOBAL GlobalReAlloc(
HGLOBAL hMem,
SIZE_T dwBytes,
UINT uFlags
);
参数hMem是GlobalAlloc的返回值,参数dwBytes是新的内存区域的大小,uFlags是新的属性.
uFlags属性:
GMEM_FIXED     分配固定内存,返回为指向内存的指针
GMEM_MOVEABLE   可以在堆内移动,地址不固定,返回值指向内存对象句柄.
       GlobalLock函数可以得到固定地址的指针,不能与GMEM_FIXED同时使用
GMEM_ZEROINIT   把分配内存内存清零
GPTR            GMEM_FIXED|GMEM_ZEROINIT
GHND            GMEM_MOVEABLE|GMEM_ZEROINIT

2.GlobalLock,GlobalHandle
GlobalLock函数的作用是使GlobalAlloc函数或GlobalReAlloc函数分配得到GMEM_MOVEABLE属性的内存
对象句柄固定,并返回内存指针.
GlobalHandle函数的作用与GlobalLock函数作用正好相反.
HGLOBAL GlobalHandle(
LPCVOID pMem
);
LPVOID GlobalLock(
HGLOBAL hMem
);

3.GlobalFlags,GlobalDiscard,GlobalUnlock
这三个函数(宏)的作用是获取和修改内存的属性.
GlobalFlags(
HGLOBAL hMen
);

4.GlobalSize
GlobalSize函数的主要作用是获取内存块大小.
SIZE_T GlobalSize(
HGLOBAL hMem
);

code:
//使用全局和局部函数分配和释放内存

/* 头文件 */
#include
#include

/*************************************
* int main(void)
* 功能 演示Global*函数的使用
*
* 参数 无
*
**************************************/
int main(void)
{
LPVOID lpMem; //内存地址
HGLOBAL hMem; //内存句柄
SIZE_T sizeMem; //内存大小
UINT uFlags; //属性

//分配内存
lpMem = (LPVOID)GlobalAlloc(GPTR,1000);
//将数据复制到内存中
lstrcpy(lpMem,"this is a string");
//获得内存属性,打印
uFlags = GlobalFlags(lpMem);
printf("内存中的内容:\"%s\",内存地址:0x%.8x,内存属性:%u\n",
   lpMem,lpMem,uFlags);
//释放
GlobalFree(lpMem);
//分配内存,获取信息
hMem = GlobalAlloc(GMEM_MOVEABLE,1000);
sizeMem = GlobalSize(hMem);
uFlags = GlobalFlags(hMem);
//打印信息
printf("内存大小:%d,内存句柄:0x%.8x,内存属性:%u\n",
   sizeMem,hMem,uFlags);
//锁定
lpMem = GlobalLock(hMem);
//释放
GlobalFree(hMem);
return 0;
}