这项我是在跟踪一个句柄参数时,用到的内存分配函 数,之前从来没有用过,所以到网上做了些调查 :
到网上些调查的资料 :
调 用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 ,则 表示未加锁 或已经 解锁 。