【问题标题】:Out of Memory error in C++/MFC appC++/MFC 应用程序中的内存不足错误
【发布时间】:2014-04-27 15:02:37
【问题描述】:

我有一个使用 VS 6 开发的旧 Doc/View C++/MFC 应用程序。 我使用 Stingray Objective Grid 8.01 Pro 作为我的数据网格。

最近,我们的“工作”规模变得更大了;这就是内存不足错误开始出现的时候。

这是给我内存不足错误的场景:

仅供参考,当我说我在以下场景中加载作业时;这意味着我读取了一个数据库,并使用将数据保存在 CArray 和 CList 对象中的自定义类将与该作业关联的数据加载到内存中;它存储在文档类中。此外,我将其中一些数据存储在该文档主视图上的两个 StingRay 网格中。

当我第一次打开应用程序时,它在 Task Mgr 中显示大约 21 MB 的内存使用量。 我首先加载一个典型的作业,然后应用程序达到 40 MB 左右。 然后我加载一个“大”作业,然后应用程序增长到大约 159 MB。 接下来,我关闭“大型”作业,应用程序降至 40 MB 左右。 然后我再次加载相同的“大型”作业,它又回到了 159 MB 左右。 然后我打开一个包含 StingRay 网格的无模式窗口,并用作业中的数据填充网格。完成后,应用程序内存使用量将跃升至 1,421 MB 左右。 然后我关闭无模式窗口,它又回到了 163 MB 左右。 然后我关闭“大”作业,它又回到了 45 MB 左右。 然后,我尝试重新打开相同的“大”作业,当我开始在主窗口(不是无模式窗口)上重新加载 Stingray 网格时,出现内存不足错误。此时,应用程序在任务管理器中显示大约 170 MB。

由于我可以毫无问题地关闭和重新打开作业,我只能假设当我在无模式窗口中将数据加载到 Stingray 网格中时;某些东西没有被释放;但如果是这样的话,为什么我在任务管理器中的内存使用量在我关闭无模式窗口后似乎恢复到几乎正常的水平。关闭无模式窗口后,它只增加了大约 5 MB。

我真正需要的是一些建议,说明当我的应用程序显示内存不足时,我的应用仅使用了 160 MB 时,如何尝试并确定为什么会出现此内存不足错误。

任何帮助将不胜感激。

谢谢,

菲尔

【问题讨论】:

  • 仅供参考,如果我在出现内存不足错误之前的任何时候关闭应用程序,我在调试模式下不会出现内存泄漏。
  • 堆碎片也是一个可能的因素,但这可能是 StingRay 网格内部的,我不知道。无论如何都值得考虑。
  • 我可以做些什么来确定这是否是由堆碎片引起的,我可以做些什么来解决它吗?
  • searching on StackOverflow 是一个很好的起点 ;-)

标签: c++ memory-management memory-leaks mfc stingray


【解决方案1】:

加载网格时获得 1,421 MB 非常接近 32 位应用程序允许的 2GB 地址范围。当然,万无一失的解决方案是成为一个 64 位应用程序,如果可能的话。您可以尝试的另一件事是使用网格的虚拟模式,因此网格不必复制数据。在虚拟模式下,您会为要绘制的每一行或每一个单元格获得一个回调,然后将文档存储中的数据提供给它。

【讨论】:

  • 我同意 1,421 危险地接近 2 GB 限制,并且我在下一个版本中实现了虚拟网格,并成功地将我的内存占用减少了一半以上。我现在在加载以前接近并且在某些情况下超过 2 GB 限制的网格时最大大约 500 MB。但是,当我的应用程序仅报告 160 MB 的使用量时,我仍然担心内存不足错误。我觉得我错过了一些东西,因为一位使用虚拟网格的新版本的测试人员仍然报告偶尔的内存不足错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2011-10-28
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多