找到最大的内存分配

Cha*_*had 4 c c++ windows malloc new-operator

在32位模式下,应用程序可以访问2GB的虚拟地址空间.如果没有malloc或新的失败,您如何找到可以分配给此虚拟地址空间的最大内存大小?

例如,假设您想要占用整个2GB的虚拟地址空间,但您只是在2GB地址空间的中间分配了2MB的数据.是否有Windows API调用,您可以找到可以分配的最大并发地址空间?那么当你调用malloc或new时,调用不会失败?

感谢您的时间.

Cha*_*had 6

来源: 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;
}
Run Code Online (Sandbox Code Playgroud)