我们都知道在程序里可以使用malloc在堆上分配内存,显然windows应该为这个Heap分配一块空间的 ,我们在主程序里用malloc分配一小块内存,看看指针指向哪里:
char* p = (char*)malloc (10);
得到一个指针:0x00b267b0
在内存块里面找,很容易就发现了目标:
从这里可以发现malloc采用的算法并不会在一开始就分配一块很大的内存,如果我们接着用:
p = (char*)malloc(0x10000);
分配一块64K的内存,这时可以发现又多了一块内存:
而这块内存在第一次分配时是空闲的。
由此可以猜测,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);
………..
}