【问题标题】:Not able to allocate 1.5GB memory in a vc++ mfc app无法在 vc++ mfc 应用程序中分配 1.5GB 内存
【发布时间】:2015-09-18 12:51:49
【问题描述】:

我有用 VS2010 编写的 MFC vc++ 应用程序。 当我尝试使用

分配大小为“185000000”的双数组时
  1. malloc : 它返回 NULL
  2. 新运算符:它抛出 CMemoryException

但是当我像这样在 c++ 中编写独立的 win32 控制台应用程序时:

double *ptr = NULL;
ptr = new double[185000000];

它运行良好,ProcessExplorer 应用显示 ~1411MB 的内存已全部覆盖。

我的 MFC 应用添加了 GUI 和许多库,可用于安捷伦仪表和 NI-6255 仪表电压测量。

【问题讨论】:

  • 您的 MFC 应用程序是编译为 32 位还是 64 位?请记住,如果它是 32 位进程,则您的进程只有 2Gb 的地址空间可供使用。
  • 我猜想在您的进程地址空间中加载的额外 DLL 会导致足够的碎片,以至于它们不会留下 1.5 GB 的可用连续空间。如果您的应用是 32 位的,但实际上将在 64 位系统上运行,则可能有一种简单的方法可以解决此问题 - 请参阅 this answer
  • 是的,我的应用程序是在 x64 16GB RAM 系统上运行的 32 位应用程序。所以我应该尝试在 64 位模式下构建它吗?是的,有很多与 MFC 相关的 dll 加载,还有安捷伦仪表和 NI 仪表库。在旁注中,我如何找出与我的应用相关的加载的 DLL?
  • 我有两个观察结果: 1. 独立应用程序能够在不启用任何选项的情况下分配 ~1411 MB 内存。但除非我按照 bogdan 的建议启用大地址空间,否则不能超过 2GB。要超过 4GB,我需要在 64 位模式下构建独立应用程序。 2. 对于 MFC 应用程序,我需要启用大地址空间以获得 ~1411 MB,但不能超过 2GB。我将构建它 x64 模式。
  • 您可以尝试使用 64 位,但您的代码和所涉及的所有库都需要支持该配置。如果不是这样,事情可能会变得丑陋。我在上面的评论中提到的解决方案的优点是非常简单(只需更改一个链接器开关),因为您的应用程序仍然是 32 位的。关于第二个问题,您可以在 Visual C++ 调试器中运行程序并使用Debug -> Windows -> Modules;您还可以使用其他工具。

标签: c++ windows visual-studio-2010 malloc


【解决方案1】:

以下链接基本上解决了问题: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

在 x64 位系统上,32 位程序可以达到 2GB 内存。 在此限制下,如果加载了额外的 DLL,则内存会变得碎片化,并且连续的地址空间不可用。因此 1.5GB 分配失败。

在 vs 项目设置中启用大地址空间标志,最高可达 4GB。

除此之外,程序需要以 64 位构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多