这项我是在跟踪一个句柄参数时,用到的内存分配函
数,之前从来没有用过,所以到网上做了些调查
:
到网上些调查的资料
:
调
用GlobalAlloc
函
数分配一块
内存,该
函数会返回分配的内存句柄。
调
用GlobalLock
函
数锁
定内存块
,该
函数接受一个内存句柄
作为
参数,然后返回一个指向被锁
定的内存块
的指针
。 您可以用
该
指
针
来
读
写内存。
调
用
GlobalUnlock
函数来解
锁
先前被
锁
定的内存,
该
函数使得指向内存
块
的指
针
无效。
调
用
GlobalFree
函数来
释
放内存
块
。您必
须
传给该
函数一个内存句柄。
GlobalAlloc
说
明
分配一个全局内存
块
返回
值
Long
,返回全局内存句柄。零表示失
败
。会
设
置
GetLastError
参数表
参数
类
型及
说
明
wFlags Long
,
对
分配的内存
类
型
进
行定
义
的常数
标
志,如下所示:
GMEM_FIXED
分配一个固定内存
块
GMEM_MOVEABLE
分配一个可移
动
内存
块
GMEM_DISCARDABLE
分配一个可
丢
弃内存
块
GMEM_NOCOMPACT
堆在
这
个函数
调
用期
间
不
进
行累
积
GMEM_NODISCARD
函数
调
用期
间
不
丢
弃任何内存
块
GMEM_ZEROINIT
新分配的内存
块
全部初始化成零
dwBytes Long
,要分配的字符数
注解
如指定了
GMEM_FIXED
,那
么
返回
值
就是要使用的
实际
内存地址即指
针
(
GlobalLock
会返回同
样
的
值
)
——
所以在使用固定内存
块
的
时
候不需要
执
行一个
GlobalLock/GlobalUnlock
操作
由于
Win32
采用了高
级
的内存管理方案,所以使用可移
动
的内存
块
并没有什
么
好
处
用
这
个函数分配的内存
块
允
许
在
8
位
边
界以内
【附】
关
于
GlobalAlloc
的
问题
--------------------------------------------------------------------------------
问
:在使用
GlobalAlloc
分配一个全局内存
块时
,使用
GMEM_FIXED
分配一个固定内存
块
与使用
GMEM_MOVEABLE
分
配一个可移
动
内存
块
到底有什
么
不同?
(
请
具 体 点
)
其效率上是否也存在差异?
为
什
么
在有些源
码
中,再使用
GMEM_MOVEABLE
标
志分配内存
时
,将使用
GlobalFree
对
其返回的内存句柄
进
行
释
放操作的
语
句注
释
掉,或者干脆就不写?
难
道是不需要
这
么
做
吗
?
--------------------------------------------------------------------------------
答:
GMEM_MOVEABLE
是允
许
操作系
统
(或者
应
用程序)
实
施
对
内存堆的管理,在必要
时
,操作系
统
可以移
动
内存
块获
取更大的
块
,或者合并一些空
闲
的内存
块
,也称
“
垃圾回收
”
,它可 以提高内存的利用率。一般情况下,内存堆空
间
是由用
户
来管理的,
windows
操作系
统
不干
预
。如果存在下列情况,即堆中有
10
个
1K
的空
闲块
,
这时
如果 直接申
请
一个
5K
的内存空
间
,会得到不成功的信息。但如果其它已
经
被占用的内存
块
是
movable
,
这时
系
统
就可以移
动
这
些内存
块
,合并出一个
5k
的内存
块
,并成功分配
给
用
户
使用。它的空
间
效率是以运行
时
的
时间
效率
为
代价的。
GlobalLock
函数功能描述:
锁
定一个全局的内存对
象,返回
指向该对
象的第一个字节
的指针
函数原型:
LPVOID GlobalLock( HGLOBAL hMem )
参数:
hMem
:全局内存对
象的句柄。这
个句柄是通过
GlobalAlloc
或GlobalReAlloc
来得到的
返回值
:
调
用成功,返回指向该对
象的第一个字节
的指针
调
用失败
,返回NULL
,可
以用GetLastError
来获
得出错
信息
注意:
调
用过
GlobalLock
锁
定一块
内存区后,一定要调
用GlobalUnlock
来解锁
。
GlobalUnlock
函数功能描述
:
解除被
锁
定的全局内存
对
象
函数原型:
BOOL GlobalUnlock( HGLOBAL hMem
);
参数:
hMem
:全局内存
对
象的句柄
返回
值
:
非零
值
,指定的内存
对
象仍
处
于被
锁
定状
态
0
,函数
执
行出
错
,可以用
GetLastError
来
获
得出
错
信息,如果返回
NO_ERROR
,
则
表示内存
对
象已
经
解
锁
了
注意:
这
个函数
实际
上
コレ将内存
对
象的
锁
定
计
数器减一,如果
计
数器不
为
0
,
则
表示
执
行
过
多个
GlobalLock
函数来
对这
个内存
对
象加
锁
,需要
对应
数目的
GlobalUnlock
函数来解
锁
。
如果通过
GetLastError
函数返回错
误码为
ERROR_NOT_LOCKED
,则
表示未加锁
或已经
解锁
。