当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>xp下用户程序空间分配(7):Heap</b>[VC/C++编程]

赞助商链接



  本文“<b>xp下用户程序空间分配(7):Heap</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

我们都知道在程序里可以利用malloc在堆上分配内存,明显windows应当为这个Heap分配一块空间的 ,我们在主程序里用malloc分配一小块内存,看看指针指向那边:

char* p = (char*)malloc (10);

得到一个指针:0x00b267b0

在内存块里面找,很简单就发现了目标:

基址 分配基址 分配保护 大小 状况 保护 范例
00b20000 00b20000 00000004

PAGE_READWRITE

00007000 00001000

MEM_COMMIT

00000004

PAGE_READWRITE

00020000

MEM_PRIVATE

00b27000 00b20000 00000004

PAGE_READWRITE

00009000 00002000

MEM_RESERVE

00000000 00020000

MEM_PRIVATE

从这里可以发现malloc采取的算法并不会在一开始就分配一块很大的内存,假如我们接着用:

p = (char*)malloc(0x10000);

分配一块64K的内存,这时可以发现又多了一块内存:

基址 分配基址 分配保护 大小 状况 保护 范例
00cd0000 00cd0000 00000004

PAGE_READWRITE

00012000 00001000

MEM_COMMIT

00000004

PAGE_READWRITE

00020000

MEM_PRIVATE

00ce2000 00cd0000 00000004

PAGE_READWRITE

000ee000 00002000

MEM_RESERVE

00000000 00020000

MEM_PRIVATE

而这块内存在第一次分配时是闲暇的.

由此可以猜想,malloc可以分配得到的最大内存块应当取 决于最大的闲暇块.写段代码测试一下:

void block_test()
{
     SYSTEM_INFO info;
     MEMORY_BASIC_INFORMATION mi;
     HANDLE hProcess;
     DWORD dwAddr;
     MEMORY_BASIC_INFORMATION miBlock[1000];
     int nCount = 0, nMaxSize = 0;
     char* p = NULL;
     hProcess = GetCurrentProcess();
     GetSystemInfo(&info);
     dwAddr = (DWORD)info.lpMinimumApplicationAddress;
     do
     {
         VirtualQueryEx(hProcess, (LPCVOID)dwAddr, &mi, sizeof(mi));
         memcpy(&miBlock[nCount++], &mi, sizeof(mi));
         dwAddr += mi.RegionSize;
         if((mi.State & MEM_FREE) && mi.RegionSize > nMaxSize)
              nMaxSize = mi.RegionSize;
     } while(dwAddr < (DWORD)info.lpMaximumApplicationAddress);

     p = malloc(nMaxSize);
………..

}


  以上是“<b>xp下用户程序空间分配(7):Heap</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .