在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;
}

09-27 08:25