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

 

Code
#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;

}

时间: 2024-09-22 03:53:17

WinApi学习笔记-第一次离内存这么近的相关文章

WinApi学习笔记-内存管理

一:进程虚拟地址空间的实现 每个进程都有一个私有的虚拟地址空间 系统将每个进程的虚拟地址空间映射到物理内存上 为了实现每个进程都有一个私有的虚拟地址空间系统为每个进程都创建了一个页目录和一组页表 每个进程的页表是独立的 而内核空间的页表是所有进程共享的 X86平台上有一个CR3寄存器,该寄存器保存当前运行的进程的页目录地址 系统进行进程切换时,会将CR3内的地址置为将要执行的进程的页目录地址 每个进程都有一个KPROCESS结构的属性,其中包括了进程页目录地址 二:数据共享与保护 有一些进程间共

WinApi学习笔记-简单的数据类型

#include <windows.h> #include <stdio.h> int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { LPSTR szString = "Windows data type string"; CHAR lpString[120]; DWORD dwMax = 0xFFFFFFFF; DWORD dwOne

WinApi学习笔记-分配和释放虚拟内存

Code#include <windows.h>#include <stdio.h>#include <iostream> using namespace std; int main(void){    SIZE_T sizeVirtual = 4000;//大小    LPVOID lpRound = (LPVOID)0x100000FF;//地址    MEMORY_BASIC_INFORMATION mbi;//内存信息     //分配内存    //MEM_C

WinApi学习笔记-创建进程

#include <windows.h> #include <stdio.h> #include <iostream> DWORD CreateChildProcess(LPSTR szChildProcessCmd); int main() { CreateChildProcess("Child.exe"); } DWORD CreateChildProcess(LPSTR szChildProcessCmd) { //启动信息结构变量 START

WinApi学习笔记-HellowWorld

在vs2008中新建一个VC++的空项目在解决方案资源管理器,源文件文件夹中添加一个CPP文件在此文件中输入以下代码 #include <windows.h> int WinMain( HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox(NULL,TEXT("HELLOW WORLD"),TEXT("XLAND"),MB_OK)

WinApi学习笔记-读写文件

读文件 #include <windows.h> #include <stdio.h> #include <iostream> DWORD MyReadFile(LPSTR filePath) { HANDLE hFileRead; LARGE_INTEGER liFileSize; DWORD dwReadSize; LONGLONG liTotalRead = 0; BYTE lpFileDataBuffer[32]; hFileRead = CreateFile(

C++内存管理学习笔记(5)

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:wdzxl198@163.com  /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9112123 /************************

C++内存管理学习笔记(3)

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:wdzxl198@163.com    /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9078965 /**********************

Akka学习笔记(五):Akka与Java的内存模型

Akka学习笔记(五):Akka与Java的内存模型 Akka简化了编写并发软件的过程,本文主要讨论Akka如何在并发应用中访问共享内存. Java内存模型 Java5之前的JMM是相当混乱的.多线程访问共享内存很有可能会得奇怪的结果,如: 可见性问题,无法及时看到其他线程写入的值 指令乱序,观测到其他线程不可能的行为 从Java 5的JSR 133的实现,很多问题就解决了.JMM是基于一组"happens-before"关联规则,限制了访问内存的行为必须在另一个内存访问行为之前发生.