2012-11-02 76 views
1

可能重复:
maximum memory which malloc can allocate!的malloc的最大尺寸()

我怎么能知道堆我可以malloc()占据的最大尺寸。 我使用MS Visual Studio 2010.

+0

目前还不清楚你在问什么。你是否希望malloc()可以分配的最大大小给予无限的内存,或者你是否问如何确定在你运行的系统中有多少内存可用? – Caleb

+2

您可以*询问* SIZE_MAX,但几乎肯定会失败。您可以成功获得多少*取决于许多因素(32位与64位,C运行时版本,操作系统版本,最大页面文件大小,可用物理内存等)。 –

回答

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是可以成功地分配量最大。

+0

我投了票,因为我在过去完全这样做(尽管不太简洁 - 很棒!)。我在Windows 7上使用GCC 4.8在C++中使用new/delete代替malloc/free。结果?我在一个块中分配了1,953,169,376个字节,并成功用值填充,然后访问这些值 - 简而言之,它可以工作。 – rmcghee

4

那么,为什么不看看它的论点...... size_t。因此,您可以分配size_tSIZE_MAX)作品中的任何内容,但无论如何它都基于size_t,如果不是,则为malloc s签名仍然是您必须处理的内容。

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

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

它有助于了解virtual address space在思考您的程序可以在给定平台上分配多少时的工作方式。

+2

我想OP想知道他/她可以分配多少内存 - 也就是说,有多少内存可以安全分配。 – Caleb

+0

@Caleb:是的,我想知道这件事。我会添加一些东西, –

+2

@Ed http://stackoverflow.com/questions/2513505/how-to-get-available-memory-cg – Austin