无法在VC++ MFC应用程序中分配1.5GB内存。

4

我有一个使用VS2010编写的MFC VC++应用程序。

当我尝试使用malloc分配大小为“185000000”的double数组时:

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

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

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

这个程序工作良好,ProcessExplorer应用程序显示已分配大约1411MB的内存。

我的MFC应用程序具有GUI,并添加了许多库以与Agilent仪表和NI-6255仪表电压测量一起使用。


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

0

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

在 x64 位系统上,32 位程序可以使用高达 2GB 的内存。 在此限制下,如果加载了其他 DLL,则内存会被分段,连续的地址空间不可用。因此,1.5GB 的分配失败了。

在 VS 项目设置中启用大地址空间标志,它可以达到 4GB。

超过这个限制,程序需要以 64 位构建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接