尽管有大量可用内存,但 malloc() 失败
Posted
技术标签:
【中文标题】尽管有大量可用内存,但 malloc() 失败【英文标题】:malloc() failure despite plenty of free memory 【发布时间】:2015-09-06 12:00:47 【问题描述】:我在具有 16GB RAM 的 PC 上运行 Windows-7-64。我启动机器并启动 Visual Studio 2015。我还启动了资源监视器,它告诉我我的内存安排如下:
硬件预留:116MB 使用中:2,917 MB 修改:79MB 待机:2,360MB 免费:10,912MB
然后我在调试模式下执行我正在开发的这个程序。该程序尝试 malloc() 1,292,000,000 字节并失败。这正好在程序运行的开始。它没有事先进行任何 malloc()/free() 操作。如果我在发布模式下运行相同的程序,那么它会成功。
知道如何解决这个问题吗?
【问题讨论】:
如果你把程序缩减为malloc(1292000000)
,你会得到同样的结果吗?
也许this 可以解决您的问题?
简单,不要分配 ~1.2 GB 的内存。
进一步了解@DavidHaim 的评论,您为什么要尝试将 1.2GB 分配给单个地址?
【参考方案1】:
尽管您使用的是 64 位操作系统,但您显然正在执行 32 位构建。您可以按照 Estiny 的建议使应用程序“感知大地址”,从而获得两倍的空间。但如果您想处理千兆字节的数据,最好切换到 64 位版本。
【讨论】:
只是想弄清楚如何将其设置为 64 位 - 完成后我会报告。 Google 将此作为设置 64 位的第一个答案。看起来很合理(我没有 VS 方便仔细检查)msdn.microsoft.com/en-US/library/ms185328.aspx @JSF - 感谢您的回答,但他不应该能够分配 2GB 作为 32 位应用程序运行吗? @WilliamJones - 您也许可以将总共最多 分配到 2 GB,但不能保证能够在一个块中全部获得。例如,程序代码可能会占用一些空间。通常会达到 1.2-1.3 GB 左右的限制。 @WilliamJones,没有 LargeAddressAware,32 位应用程序的总地址空间不到 2GB,但该空间被程序加载的 DLL 碎片化。因此,您不能在接近总数的任何地方分配单个块。我不知道哪些 DLL 在原始版本中加载,所以我无法预测您是否可以分配 1.2GB 块。但考虑到它不起作用的事实,我相信 2GB 总地址空间的碎片是原因的解释。在 32 位操作系统中,LargeAddressAware 可能没有区别或增加到 3GB,在 64 位操作系统中,4GB。以上是关于尽管有大量可用内存,但 malloc() 失败的主要内容,如果未能解决你的问题,请参考以下文章
尽管有另一种货币的可用资金,但 PayPal 沙盒以一种货币重复付款失败