C ++ / MFC应用程序中的内存不足错误

时间:2014-03-20 15:59:49

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

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

最近,我们的工作"尺寸变得更大;这就是内存不足错误开始出现的时候。

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

仅供参考,当我说我在下面的场景中加载一份工作时;这意味着我读取数据库并使用保存CArray和CList对象中的数据的自定义类将与该作业关联的数据加载到内存中;它存储在文档类中。另外,我将一些数据存储在该文档的主View上的两个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时出现内存不足错误的原因的建议。

任何帮助都将不胜感激。

谢谢,

菲尔

1 个答案:

答案 0 :(得分:1)

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

相关问题