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