无法在 vc++ mfc 应用中分配 1.5GB 内存

Not able to allocate 1.5GB memory in a vc++ mfc app

提问人:Anurag Daware 提问时间:7/1/2015 最后编辑:Anurag Daware 更新时间:8/21/2015 访问量:594

问:

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

  1. malloc :返回 NULL
  2. new 运算符:它抛出 CMemoryException

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

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

它工作正常,ProcessExplorer 应用程序显示 ~1411MB 内存已全部覆盖。

我的MFC应用程序具有GUI和许多库,可与Agilent仪表和NI-6255仪表电压测量配合使用。

C++ Windows 可视化工作室 2010 malloc

评论

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

答:

0赞 Anurag Daware 8/21/2015 #1

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

在 x64 位系统上,32 位程序最高可达 2GB 内存。 在此限制中,如果加载了其他 DLL,则内存将碎片化,并且连续地址空间不可用。因此,1.5GB 分配失败。

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

在此之上,程序需要以 64 位构建。