Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 找到可能的最大内存分配_C++_C_Windows_Malloc_New Operator - Fatal编程技术网

C++ 找到可能的最大内存分配

C++ 找到可能的最大内存分配,c++,c,windows,malloc,new-operator,C++,C,Windows,Malloc,New Operator,在32位模式下,应用程序可以访问2GB的虚拟地址空间。在没有malloc或new故障的情况下,您如何找出可以分配给该虚拟地址空间的最大内存大小 例如,假设你想占用整个2GB的虚拟地址空间,但是你刚刚在2GB地址空间中间分配了2MB的数据。是否有一个Windows API调用可以找出可以分配的最大并发地址空间?这样,当您调用malloc或new时,调用不会失败 谢谢您的时间。您可以使用函数查询可能的页面,看看它们是否返回MEM\u FREE您可能永远不会得到满意的答案。最大的可分配内存块取决于内存

在32位模式下,应用程序可以访问2GB的虚拟地址空间。在没有malloc或new故障的情况下,您如何找出可以分配给该虚拟地址空间的最大内存大小

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


谢谢您的时间。

您可以使用函数查询可能的页面,看看它们是否返回
MEM\u FREE
您可能永远不会得到满意的答案。最大的可分配内存块取决于内存碎片,可以通过内存碎片整理工具、不同的内存管理器、不同的启动时间开关(例如windows上的/3GB)甚至重新启动来更改

我不知道你所说的“没有malloc或新的失败”是什么意思,你没有访问malloc的权限吗?因为正确的方法是在递增步骤中使用var=malloc(…)分配内存,并查找var为null的步骤

我很确定,你所寻找的信息只能通过探索来确定。由于正在运行的进程的分配和解除分配,信息始终处于流动状态,它只能是当前情况的快照,当然,为了拍摄快照,所有进程都必须暂时挂起。因此,在Windows扫描结果并将其返回给您之后,您将获得的信息既不准确也不灵活,因为内存分配的结构现在可能已经发生了很大的变化。

来源:


我很想知道您将如何使用这些信息,知道可用内存量对您有何帮助?如果你的应用程序需要分配x数量的内存,然后出现故障,这与知道内存不足并没有多大区别。您仍然无法获得所需的内存。也许他正在实现某种类型的垃圾收集器?任何“解决方案”的问题都是,您得到的任何数据都可能在您得到它的那一刻就过时。@Toolbox:在这种情况下,知道最大可能的分配将有助于他。。。怎么做?@Raedwald,不,我想知道有多少空间是可用的,而不需要猜测它。不完全准确,因为CRT可能分配一个页面,但不使用所有页面,其余页面可以使用。
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;
}