windows api 堆的简单操作(笔记)

这个程序是示例代码,表示我学过。。。。下次方便查找

/* ************************************

*《精通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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值