zoukankan      html  css  js  c++  java
  • 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;


    }
  • 相关阅读:
    数据库+mysql
    网络并发项目
    网络编程 IO模型
    并发编程之死锁、进程池、协程
    类的使用
    面向对象—多态,反射
    面向对象-三大特性
    继承与派生
    面向对象
    模块进阶(二)
  • 原文地址:https://www.cnblogs.com/liulun/p/1574330.html
Copyright © 2011-2022 走看看