尽管有大量可用内存,但 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 沙盒以一种货币重复付款失败

为啥启动 Numba cuda 内核最多可使用 640 个线程,但在有大量可用 GPU 内存时却因 641 而失败?

malloc函数分配内存失败的常见原因

realloc 失败的可能性有多大?

c语言内存分配-malloc

new和malloc申请内存失败后的处理