<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |