又发现一篇强文,收藏收藏--------------WinCE内存管理(三)
来源:互联网 发布:天津广电网络 编辑:程序博客网 时间:2024/04/29 09:12
又发现一篇强文,收藏收藏--------------WinCE内存管理(三)
(2007-07-19 17:53:10)转载▼
本地堆
在本地堆中分配内存
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除外。
- 又发现一篇强文,收藏收藏--------------WinCE内存管理(三)
- 又发现一篇强文,收藏收藏--------------WinCE内存管理(二)
- 又发现一篇强文,收藏收藏--------------WinCE内存管理(四)
- 内存管理收藏
- WinCE内存管理(三)
- 又看到一篇强文(转载)
- C++内存管理详解(收藏)
- 经典收藏之 - C++内存管理详解
- 经典收藏 C++内存管理操作详解
- 经典收藏 C++内存管理操作详解
- 经典收藏 C++内存管理操作详解
- 什么是内存对齐(收藏)
- 收藏一篇职业选择文章
- 收藏一篇文档
- C/C++动态内存创建与内存管理 收藏
- 收藏一个WinCE读写ini
- 发现一篇spring quarty的好文章,已配置成功,收藏
- 收藏
- Android-MonkeyRunner 工具说明
- 又发现一篇强文,收藏收藏--------------WinCE内存管理(二)
- 【构建Android缓存模块】
- Ubuntu12.04中无线网无法激活解决方法
- Fedora安装Virtualbox后无法运行:/etc/init.d/vboxdrv setup的解决
- 又发现一篇强文,收藏收藏--------------WinCE内存管理(三)
- 决策树
- 又发现一篇强文,收藏收藏--------------WinCE内存管理(四)
- arm bank 的划分
- NFS、ramdisk起根文件系统
- 第二天! 把文件写入ROM内存
- Android--SlidingDrawer的使用介绍
- IOS开发之系统架构
- Linux下chkconfig命令详解