1

可能重复:
malloc 可以分配的最大内存!

我怎么知道我可以占用的堆的最大大小malloc()。我使用 MS Visual Studio 2010。

4

2 回答 2

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是您可以成功分配的最大金额。

于 2012-11-02T20:27:17.620 回答
4

好吧,为什么不看看它的论点size_t...... 因此,您可以分配size_t(范围内的任何内容也可以,但无论如何SIZE_MAX它都是基于的,如果不是,则 s 签名仍然是您必须处理的)。size_tmalloc

您的问题有点不清楚,但是如果您实际上是在问最大堆大小是多少,那么理论上,它是由本机指针大小决定的。例如,在 32 位系统上,指针可以保存 0 到 2^32-1 之间的任何地址(当然,地址 0 通常不是有效的)。

当然,在实践中,必须考虑一些细节,其中大部分是特定于操作系统的。机器中安装了多少物理内存 (RAM)?如果您的操作系统使用虚拟地址,那么这会使事情变得复杂,因为您不再受物理 RAM 的限制(尽管性能会随着不断的分页而急剧下降)。

在考虑程序可以在给定平台上分配多少时,它有助于理解虚拟地址空间的工作原理。

于 2012-11-02T20:22:32.250 回答