【问题标题】:Out of Memory Message box内存不足消息框
【发布时间】:2013-08-01 11:18:23
【问题描述】:

我有一个用 VS2003 开发的 MFC 应用程序 它在 XP vista 等中运行良好。 但是当我在 Windows 8 中执行它时,我们使用了一段时间, 然后不显示任何窗口。而是显示带有消息“内存不足”的 MessageBox。消息框包含我的应用程序的标题。

这个问题在 Windows 7 中也很少发生。 我曾尝试使用 processexplorer 之类的工具观察句柄,但它并没有增加。 也有很多论坛说是因为未关闭的句柄或资源的增加。

任何人都可以建议我如何找到问题所在。或者任何人提供了可能的原因。

我无法在导致问题的机器中设置 devenv。我很困惑如何通过在其中执行测试构建来进行诊断。

请提供您的发现。 提前致谢。

【问题讨论】:

  • 肯定会发生内存泄漏。让我告诉你 MFC exe 将他的内存分配从一个版本更改为另一个版本。可能是您的 xp 机器没有显示消息框,但存在问题。
  • 最好的方法是调试它或使用消息框调试。

标签: windows visual-c++ mfc dialog


【解决方案1】:

您显然在某处存在内存泄漏。不看代码很难说得更具体。

调试器确实是解决此问题的最佳方法。如果您可以在您的开发机器上重现该问题,那将是最简单的情况。如果没有,您可以在本地或远程将调试器附加到另一台机器上正在运行的进程。

MFC 库还支持一些基本的memory leak detection,默认情况下为调试版本打开,并且可以使用AfxEnableMemoryTracking 函数控制其他版本。您可以使用此功能来获取有关哪些内存块已分配但未正确释放(即泄漏)的信息。

正如您所提到的,Process Explorer 是另一种追踪资源泄漏的好方法。您确定句柄计数保持不变而不是随着时间的推移呈上升趋势?如果列中的值永远不会改变,就像问题所暗示的那样,那么你肯定做错了什么。您的应用程序必须创建对象才能完成其工作。关键是确保它在完成后处理它们。

如果您无法重现正在运行的应用程序的问题并且只有源代码可用,您需要仔细检查代码并确保每次使用 new delete 的相应使用(并且 new[]delete[] 匹配)。通常在 C++ 中,您应该尽可能避免显式动态内存分配。而是使用 MFC 或标准库提供的容器类。例如,不要手动分配数组,使用std::vector 为您分配。这些容器类确保当对象超出范围时,内存在析构函数中自动释放。

【讨论】:

  • 感谢您的回复。问题发生时,应用程序的内存使用量约为 4MB。在此之前,它在 3.5 到 5 MB 之间变化......
猜你喜欢
  • 1970-01-01
  • 2020-12-15
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多