如何通过malloc()
知道我可以占用的堆的最大大小。
我使用的是MS Visual Studio 2010。
答案 0 :(得分:7)
有与操作系统相关的方法可以找出可用于您的进程的虚拟内存量,但我不知道如何在Windows上执行此操作。但是,您可以通过执行搜索+减半搜索来找到它,使用更大的参数调用malloc直到它失败,然后查看它的值。像
这样的东西for(i=1; v=malloc(i); i<<=1) free(v);
此时你知道i / 2字节是正常的,而i字节不正常。现在进行二分搜索实际最大值:
for(a=(i>>1), b=i; a < b-1;)
{
c=(a+b)>>1;
if(v=malloc(c)) { a=c; free(v); }
else b=c;
}
此时,a
是您可以成功分配的最大金额。
答案 1 :(得分:4)
那么,为什么不看看它的论点...... size_t
。因此,您可以分配size_t
范围内的任何内容(SIZE_MAX
也可以使用,但无论如何它都基于size_t
,如果不是,则为malloc
签名仍然是你必须处理的事情。)
你的问题有点不清楚,但如果你实际上问的是最大堆大小是什么,理论上,它是由本机指针大小决定的。例如,在32位系统上,指针可以保存0到2 ^ 32-1之间的任何地址(当然,地址0通常不是有效的。)
当然,在实践中,必须考虑细节,其中大多数是特定于操作系统的。机器中安装了多少物理内存(RAM)?如果你的操作系统使用的是虚拟地址,那么这会使你的内容变得复杂,因为你不再受物理内存的限制(尽管性能会随着不间断的分页而下降)。
在考虑您的程序在给定平台上可以分配多少时,有助于了解virtual address space的工作原理。