1

我有一个使用 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 时出现内存不足错误的建议。

任何帮助,将不胜感激。

谢谢,

菲尔

4

1 回答 1

1

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

于 2014-03-20T16:11:40.287 回答