windows api 堆的简单操作(笔记)
来源:互联网 发布:c语言实战1200例 pdf 编辑:程序博客网 时间:2024/09/21 08:15
这个程序是示例代码,表示我学过。。。。下次方便查找
/* ************************************
*《精通Windows API》* 示例代码
* heap.c
* 5.2 堆管理
**************************************/
/* 头文件 */
#include <windows.h>
#include <stdio.h>
/*************************************
* DWORD PrintHeapSize(HANDLE hHeap,LPVOID lpMem)
* 功能 获取堆的大小并打印出来
*
* 参数 HANDLE hHeap,堆句柄
* LPVOID lpMem,内存地址指针
*
* 返回值 0代表执行完成,1代码发生错误。
**************************************/
DWORD PrintHeapSize(HANDLE hHeap,LPVOID lpMem)
{
SIZE_T dwHeapSize;
dwHeapSize = HeapSize(hHeap,HEAP_NO_SERIALIZE,lpMem);
if(dwHeapSize == -1)
{
printf("Get HeapSize error :%d",GetLastError());
return 1;
}
printf("内存块大小为:0x%x\n",dwHeapSize);
return 0;
}
/*************************************
* int main(int argc, PCHAR argv[])
* 功能 演示堆的使用
*
* 参数 argv[1]如果为“-s”那么使用进程堆
* argv[1]如果为“-a”那么创建一个可变大小的堆
* argv[1]如果为其他,那么创建有最大大小的堆。
*
* 2007年10月
*
**************************************/
int main(int argc, PCHAR argv[])
{
SYSTEM_INFO si;//系统信息
HANDLE hHeap; //堆句柄
LPVOID lpMem; //内存块指针
LPVOID lpReAlloc;//内存块大小调整后的指针
DWORD dwHeapSize;//堆内存埠大小
HANDLE hHeaps[24];//用于保存进程中所有的堆句柄
DWORD dwHeapNum;//进程中堆的数量\
//获取系统信息
GetSystemInfo(&si);//msdn中查不到,直接看他的源码,加上百度百科解释就明白了
//将系统内存分页大小,与内存分配粒度打印出来。
printf("系统内存页大小: 0x%x\n系统内存分配粒度:0x%x\n",
si.dwPageSize,si.dwAllocationGranularity);
//分析输入参数,如果是“-a”创建一个最大为10个分页大小的堆
if(argc == 2 && 0==lstrcmp(argv[1],"-a"))
{
hHeap = HeapCreate(HEAP_NO_SERIALIZE,
si.dwPageSize,si.dwPageSize*10);
printf("创建堆,初始化大小为1页,最大为10页\n");
}
//如果输入参数为“-s”使用进程初始化时已经存在的堆
else if(argc == 2 && 0==lstrcmp(argv[1],"-s"))
{
hHeap = GetProcessHeap();
printf("获取系统已经存在的堆\n");
}
//如果输入其他,创建一个可增长的堆
else
{
hHeap = HeapCreate(HEAP_NO_SERIALIZE,0,0);
printf("创建堆,初始化大小为1页,大小可变\n");
}
//判断堆是否创建/获取成功
if(hHeap == NULL)
{
printf("创建或获取进程堆错误: %d",GetLastError());
return 1;
}
//获取将打印当前进程中一共有多少个堆,有没有新建堆,值会不同
dwHeapNum = GetProcessHeaps(24,hHeaps);
if(dwHeapNum == 0)
{
printf("GetProcessHeaps error: %d",GetLastError());
}
else
{
printf("当前进程一共有%d个堆\n",dwHeapNum);
}
//在堆上分析内存,3个页面大小
lpMem = HeapAlloc(hHeap,HEAP_ZERO_MEMORY,si.dwPageSize*3);
if(lpMem == NULL)
{
printf("HeapAlloc error: %d",GetLastError());
return 1;
}
printf("在堆上成功分配内存,起始地址为:0x%x\n",lpMem);
//打印当前堆内存块的大小
PrintHeapSize(hHeap,lpMem);
//再分配内存,调整内存的大小为11个分页大小,
//如果使用第一种方法创建堆,这里会出错
lpReAlloc = HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, lpMem, si.dwPageSize*11);
if(lpReAlloc == NULL)
{
printf("HeapReAlloc error: %d",GetLastError());
return 1;
}
printf("在堆上再分配内存,地址为:0x%x,原地址:0x%x\n",lpReAlloc,lpMem);
//打印调整大小后的堆内存块大小
PrintHeapSize(hHeap,lpReAlloc);
//释放内存
if(!HeapFree( hHeap, HEAP_NO_SERIALIZE, lpReAlloc))
{
printf("HeapFree error: %d",GetLastError());
return 1;
}
printf("释放内存成功\n");
//如果新建了堆,销毁堆。
if(argc != 2 || 0!=lstrcmp(argv[1],"-s"))
{
printf("销毁HeapCreate创建的堆\n");
if(!HeapDestroy(hHeap))
{
printf("HeapDestroy error: %d",GetLastError());
return 1;
}
printf("销毁堆成功\n");
}
return 0;
}
- windows api 堆的简单操作(笔记)
- 堆的一些简单操作
- Windows操作注册表API简单例子
- windows堆管理API
- Window API (三)堆管理操作
- 简单的Windows API程序结构
- HBase学习笔记-API简单操作
- Hive学习笔记-API简单操作
- 简单的API操作hdfs
- Windows进程内部堆的操作
- 乱七八糟的Windows API笔记
- 简单堆的创建和操作
- STL学习笔记(三) 堆的操作
- 算法之最简单的堆笔记
- 堆的操作(最大堆)
- 简单的客户/服务器程序(基于windows Socket API)
- Windows文件操作的API(CreateFile系列)
- Windows文件操作的API(CreateFile系列)
- 看图片 读故事:轻松理解数字签名和数字证书
- 在js中如何使用php数据
- bool findInt32(uint32_t key, int32_t *value)函数 =>个人理解!
- MVC3 DropDownListFor
- 基带芯片
- windows api 堆的简单操作(笔记)
- IE Firefox通用DOM
- js 异步提交表单
- 【高效程序员系列】3 别碰鼠标——让键盘飞起来
- surfer 8 scripter 学习笔记(4)基本语法
- 全光网络的前世今生
- 吐槽
- js特效鼠标移到图片上时图片颜色减淡
- 单例模式