【问题标题】:C - Program crashes if I doesn't minimize the window for more than 15 minutes [closed]C - 如果我没有将窗口最小化超过 15 分钟,程序就会崩溃 [关闭]
【发布时间】:2015-01-24 17:38:30
【问题描述】:

我用 C 语言开发了一个包含大约 20 个函数的应用程序。我使用动态内存分配来返回二维数组的每个地方。此外,在每次迭代中还有大约 5,000,000 次迭代和大约 50 - 100 x 100 的矩阵。我想我已经正确释放了分配的内存。当我启动程序时,RAM 内存从 1000KB 开始(我在 Windows 任务管理器中查看过)。它慢慢上升,程序崩溃。我最初以为我的程序存在内存泄漏;但调试1周后,我没有发现。然后我发现,当我最小化正在运行程序的窗口时,RAM 使用量回落到 1000k,然后又上升了。我需要每隔 10 到 15 分钟最大化和最小化一次,以阻止我的程序崩溃。我的模拟运行了 12 个小时。我不能一整天都最大化和最小化窗口。我想了以下几点,却无处可去。

  1. 如果我的程序没有内存泄漏,为什么我的程序大小会增加并崩溃?
  2. 假设我的程序有内存泄漏,并且通过一些魔术窗口正在努力删除未使用的内存,为什么当我不最小化窗口时它会崩溃?
  3. 如果我的程序有泄漏,为什么我每 10 分钟最小化一次窗口时它没有崩溃?
  4. 只有当我最小化窗口时它才会刷新 RAM 是 Windows 错误吗?我是这种情况,那么几乎没有程序应该工作。

一般观察:通过每 10 分钟最小化和最大化程序窗口成功运行这些模拟后,我的系统变慢了;但没有崩溃。这导致了windows有一个bug的唯一结论。 最后说明:我在 win XP 32 位上运行。 GCC 编译器。在代码块中编写代码。

【问题讨论】:

  • 你说它慢慢上升,程序崩溃所以听起来肯定有内存泄漏,这个问题不能用提供的信息来回答。仅供参考,最小化窗口可能会导致操作系统修剪进程的工作集。
  • 对于每次迭代,我都使用 printf 语句。 Sourav Ghosh 先生有办法解决这个问题吗?
  • 没有实际程序,我们在黑暗中拍摄空白。
  • 用调试器运行它。并检查您的mallocs 中没有一个返回NULL。 Windows 肯定有错误,但您遇到的崩溃肯定不是 Windows 错误的结果。
  • 使用内存泄漏检测器。你考虑过在 Linux 上工作吗? (许多超级计算机和工作站都在使用它,它有valgrind ...)

标签: c windows memory memory-leaks


【解决方案1】:

我的代码中肯定存在内存泄漏。我终于找到了。我的问题解决了。但问题仍然存在“为什么每次我最小化模拟窗口时我的内存使用量都会下降?”正如@Alex K. 所说,当我们最小化进程时,操作系统会修剪它的工作集。这对我来说完全是一个奇迹。

对于遭受内存泄漏的人,我建议不要使用 valgrind,而是使用一些全局变量,比如“泄漏”。每次使用 malloc 或 calloc 或 realloc 时递增,每次使用 free 时递减。在 IDE 的调试模式下观察观察窗口中的变量“泄漏”(存在于代码块和几乎每个 IDE 中)。我通过这种方式发现了我的内存泄漏。

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多