WinApi学习笔记-第一次离内存这么近

#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
//参数1堆句柄,参数2内存地址指针
DWORD PrintHeapSize(HANDLE hHeap,LPVOID lpMem)
{
SIZE_T dwHeapSize;
dwHeapSize = HeapSize(hHeap,HEAP_NO_SERIALIZE,lpMem);
if(dwHeapSize == -1)
{
std::cout<<"GetHeapSizeError"<<std::endl;
return 1;
}
std::cout<<"内存块大小为:"<<dwHeapSize<<std::endl;
}
int main()
{
SYSTEM_INFO si;//系统信息
HANDLE hHeap;//堆句柄
HANDLE hHeap2;
HANDLE hHeap3;
LPVOID lpMem;//内存块指针
LPVOID lpReAlloc;//内存块大小调整后的指针
DWORD dwHeapSize;//堆大小
HANDLE hHeaps[24];//用于存储进程中所有堆句柄
DWORD dwHeapNum;
GetSystemInfo(&si);
cout<<"系统内存分页大小:"<<si.dwPageSize<<"Byte"<<endl<<"系统内存分配粒度"<<si.dwAllocationGranularity<<endl;
hHeap = HeapCreate(HEAP_NO_SERIALIZE,si.dwPageSize,si.dwPageSize*10);
cout<<"创建了一个堆,初始化大小为1页,最大为10页"<<endl;
hHeap2 = HeapCreate(HEAP_NO_SERIALIZE,0,0);
cout<<"创建堆,初始化大小为1页,大小可变"<<endl;
hHeap3 = GetProcessHeap();
cout<<"获取系统已经存在的堆"<<endl;
if(hHeap == NULL||hHeap2 == NULL||hHeap3 == NULL)
{
cout<<"创建内存失败"<<GetLastError()<<endl;
return 1;
}
dwHeapNum = GetProcessHeaps(24,hHeaps);
if(dwHeapNum == 0)
{
printf("Get All Heaps Error");
return 1;
}
else
{
cout<<"当前一共有"<<dwHeapNum<<"个堆"<<endl;
}
lpMem = HeapAlloc(hHeap2,HEAP_ZERO_MEMORY,si.dwPageSize*3);
if(lpMem==NULL)
{
cout<<"分配内存失败"<<GetLastError()<<endl;
return 1;
}
printf("在堆上分配内存成功,起始地址为0x%x\n",lpMem);
//调用辅助函数,打印内存块大小
PrintHeapSize(hHeap2,lpMem);
lpReAlloc = HeapReAlloc(hHeap2,HEAP_ZERO_MEMORY,lpMem,si.dwPageSize*11);
printf("重新分配内存,调整内存大小为11个分页,新地址为0x%x\n",lpReAlloc);
PrintHeapSize(hHeap2,lpReAlloc);
CHAR A;
cin>>A;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?