我有一个使用vs6开发的旧Doc/View c++/MFC应用程序。我使用Stingray Objective Grid 8.01 Pro作为我的数据网格。
最近,我们的"工作"规模变得更大了;这时内存不足错误开始出现
下面是给我内存不足错误的场景:
仅供参考,当我说我在下面的场景中加载工作时;这意味着我读取一个数据库,并使用自定义类将与该作业相关的数据加载到内存中,这些类将数据保存在CArray和CList对象中;它存储在文档类中。此外,我将其中一些数据存储在该文档的主视图上的两个StingRay网格中。
当我第一次打开应用程序时,它在任务管理器中显示大约21 MB的内存使用情况。我从加载一个典型的作业开始,应用程序大约有40mb。然后我加载一个"大"作业,然后应用程序增长到大约159 MB。接下来,我关闭"large"作业,应用程序的大小下降到大约40 MB。然后我再次加载相同的"大型"作业,它又回到了159 MB左右。然后打开一个包含StingRay网格的非模态窗口,并用作业中的数据填充网格。当这样做时,应用程序内存使用将跳转到大约1,421 MB。然后我关闭非模态窗口,它又回到163 MB左右。然后我关闭"large"作业,它又回到45 MB左右。然后我尝试重新打开相同的"大"作业,当我开始在主窗口(不是非模态窗口)上重新加载黄貂鱼网格时,我得到内存不足错误。此时,应用程序在任务管理器中显示大约170 MB。
由于我可以关闭和重新打开作业而没有任何问题,我只能假设当我在非模态窗口中将数据加载到Stingray网格时;有些东西没有得到释放;但如果是这样的话,为什么我在任务管理器中使用的内存在我关闭非模态窗口后似乎回到了几乎正常的水平。在我关闭非模态窗口后,它只大了大约5mb。
我真正需要的是一些关于如何尝试和确定为什么我得到这个内存错误时,我的应用程序只使用了160 MB当它说内存不足的建议。
如有任何帮助,不胜感激。
谢谢,菲尔
在加载网格时获得1,421 MB,这与32位应用程序允许的2GB地址范围非常接近。当然,如果可能的话,最可靠的解决方案是成为64位应用程序。您可以尝试的另一种方法是使用网格的虚拟模式,这样网格就不必复制数据。在虚拟模式下,您将获得要绘制的每一行或单元格的回调,并将文档存储中的数据提供给它。