【发布时间】:2015-09-18 12:51:49
【问题描述】:
我有用 VS2010 编写的 MFC vc++ 应用程序。 当我尝试使用
分配大小为“185000000”的双数组时- malloc : 它返回 NULL
- 新运算符:它抛出 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