在32位模式下,应用程序可以访问2GB的虚拟地址空间。您如何找出可以分配给该虚拟地址空间的最大内存大小,而又不会出现malloc或新的失败?
例如,假设您要占用整个2GB的虚拟地址空间,但是您只是在2GB的地址空间中间分配了2MB的数据。是否有Windows API调用,您可以找出可以分配的最大并发地址空间?这样,当您调用malloc或new时,调用不会失败?
感谢您的时间。
最佳答案
来源:
http://www.voyce.com/index.php/2009/08/21/largest-free-block-of-address-space/
DWORD FindLargestSizeOfMemory()
{
MEMORY_BASIC_INFORMATION mbi;
DWORD start = 0;
bool recording = false;
DWORD freestart = 0, largestFreestart = 0;
__int64 free = 0, largestFree = 0;
while (true)
{
SIZE_T s = VirtualQuery((LPCVOID)start, &mbi, sizeof(mbi));
if (s != sizeof(mbi)) break;
if (mbi.State == MEM_FREE)
{
if (!recording) freestart = start;
free += mbi.RegionSize;
recording = true;
}
else
{
if (recording)
{
if (free > largestFree)
{
largestFree = free;
largestFreestart = freestart;
}
}
free = 0;
recording = false;
}
start += mbi.RegionSize;
}
return largestFree;
}