【问题标题】:malloc() failure despite plenty of free memory尽管有大量可用内存,但 malloc() 失败
【发布时间】: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 分配给单个地址?

标签: c++ memory-management visual-studio-2015


【解决方案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。
猜你喜欢
  • 2010-12-09
  • 1970-01-01
  • 2019-04-06
  • 2011-01-26
  • 1970-01-01
  • 2011-11-10
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多