转自:http://blog.csdn.net/wuan584974722/article/details/8566259
堆
本地堆
在本地堆中分配内存
HLOCAL
LocalAlloc
(UINT
uFlags,
UINT
uBytes);
调用返回一个
HLOCAL
,这是本地内存块的句柄,但是由于内存块是固定分配的,所以返回值可以被简单地看作是一个指向块的指针。
uFlags
参数描述了内存块的特征。标志由于Windows CE
被限制固定分配操作,只支持以下内存:
LMEM_FIXED
在本地堆中分配一个固定内存块,因为本地堆分配已经固定,所以是多余的。
LMEM_ZEROINIT
初始化内存内容为0
。
LPTR
合并
LMEM_FIXED
和LMEM_ZEROINIT
标志。
uBytes
参数指定了要分配的内存块的大小,以字节为单位。块大小要补齐,但是只针对后面8
字节范围。
释放本地堆的内存
HLOCAL
LocalFree
(HLOCAL
hMem);
函数需要本地堆内存句柄,成功会返回NULL。如果调用失败,会返回内存块的句柄。
改变和查询本地堆内存的大小
HLOCAL
LocalReAlloc
(HLOCAL
hMem,
UINT
uBytes,
UINT
uFlag);
hMem
参数是一个由LocalAlloc
返回的指针(句柄)。uBytes
参数是内存块的新大小。uFlag
参数包含给新内存块的标志。在Windows CE
中,有两个新标志与之相关,LMEM_ZEROINIT
和LMEM_MOVEABLE。
LMEM_ZEROINIT
表示调用函数后内存块中新增加的区域被初始化为0
。LMEM_MOVEABLE
标志告诉Windows
,当内存块增加后,没有合适的空间容纳内存块时,函数可以立即移动内存块。如果没有这个标志,当你没有合适的空间来满足需要的时候,LocalRealloc
将会出现out-of-memory的错误而
失败,如果你指定了
LMEM_MOVEABLE
标志,调用将会返回句柄(实际是指向内存块的指针)。
内存块的大小可以通过以下调用查询:
UINT
LocalSize
(HLOCAL
hMem);
返回内存块最少需要的内存大小。像我前面提到的,Windows CE本地堆自动以8个字节来补齐(译者注:就是分配1字节要占8字节)。
分离堆
在Windows CE下的堆和Windows XP下有着同样的API。唯一值得注意的不同是缺少
HEAP_GENERATE- _EXCEPTIONS
标志。在Windows XP
下,该标志表示系统在分配请求不合适的时候产生一个异常。
建立一个分离堆
HANDLE HeapCreate (DWORD flOptions, DWORD dwInitialSize,
在Windows CE中,第一个参数
flOptions
必须为空或包含HEAP_NO_SERIALIZE
标志。默认情况下,Windows
堆管理程序防止一个进程中的两个线程在同意时间访问堆。这个串行参数防止系统用来跟踪堆中内存块分配的堆指针被破坏。在其他版本的Windows
中,当你不需要这种保护时可以使用HEAP_NO_SERIALIZE
标志。在Windows CE
中,该标志是为了兼容性而提供的,所有的堆访问都是串行的(译者注:串行即非并行,只能依次访问)。
其他两个参数,
dwInitialSize
和dwMaximumSize
,指定了最初的大小和预期的堆最大值。dwMaximumSize
的值确定虚拟内存空间保留给堆多少页。如果你想让Windows
来决定有多少页可以保留,你可以把这个参数设为0
。默认一个堆的大小是188KB
,dwInitialSize
参数决定了有多少这些保留的页将被提交。如果该参数为0
,表示堆将一页一页提交。
在分离堆中分配内存
LPVOID
HeapAlloc
(HANDLE
hHeap,
DWORD
dwFlags,
DWORD
dwBytes);
释放分离堆中的内存
BOOL
HeapFree
(HANDLE
hHeap,
DWORD
dwFlags,
LPVOID
lpMem);
dwFlags
参数唯一的标志是HEAP_NO_SERIALIZE
,当hHeap
包含堆句柄时,lpMem
参数指向要释放的内存块。
改变和查询分离堆中内存的大小:
LPVOID HeapReAlloc (HANDLE hHeap, DWORD dwFlags, LPVOID lpMem,
DWORD
HeapSize
(HANDLE
hHeap,
DWORD
dwFlags,
LPCVOID
lpMem);
参数就像你想象的:有堆的句柄,单选标志
HEAP_NO_SERIALIZE,和指向内存块的指针。
销毁一个分离堆
BOOL
HeapDestroy
(HANDLE
hHeap);
在堆中单个的内存块并不需要在销毁堆前释放。
最后一个是写DLL时比较有价值的函数:
HANDLE
GetProcessHeap
(VOID);
返回的是调用DLL时进程的本地堆的句柄。这个函数允许一个DLL在调用者进程的本地堆中分配内存。
GetProcessHeap返回的句柄可以供其他堆调用使用,
HeapDestroy
除外。