malloc()的最大大小

Aan*_*Aan 1 c heap malloc visual-studio

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

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

ama*_*rea 7

有与操作系统相关的方法可以找出可用于您的进程的虚拟内存量,但我不知道如何在Windows上执行此操作.但是,您可以通过执行搜索+减半搜索来找到它,使用更大的参数调用malloc直到它失败,然后查看它的值.就像是

for(i=1; v=malloc(i); i<<=1) free(v);
Run Code Online (Sandbox Code Playgroud)

到目前为止,您知道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;
}
Run Code Online (Sandbox Code Playgroud)

此时,a是您可以成功分配的最大金额.


Ed *_* S. 5

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

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

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

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

  • 我认为OP想知道他/她实际上可以分配多少内存——也就是说,有多少内存可用于安全分配。 (2认同)
  • @Ed http://stackoverflow.com/questions/2513505/how-to-get-available-memory-cg (2认同)