【问题标题】:Cannot use fclose on output stream, input stream is fine不能在输出流上使用 fclose,输入流很好
【发布时间】:2011-02-17 08:11:06
【问题描述】:

每当我在最后使用fclose(outputFile); 运行我的程序时,都会出现错误。 glibc 检测到...损坏的双链表

不过,令人困惑的是,我在它的正上方有fclose(inputFile);,它工作正常。有什么建议吗?

FILE* inputFile = fopen(fileName, "r");
if (inputFile == NULL)
{
    printf("inputFile did not open correctly.\n");
    exit(0);
}
FILE* outputFile = fopen("output.txt", "wb");
if (outputFile == NULL)
{
    printf("outputFile did not open correctly.\n");
    exit(0);
}

/* ... read in inputFile ... */
/* ... some fprintf's to outputFile ... */

fclose(inputFile);
fclose(outputFile);

【问题讨论】:

  • 显然问题出在您未显示的代码中。这使得提供帮助有点困难。
  • 这是一个单独的问题...但是您的代码中有泄漏;打开 outputFile 失败时,您忘记关闭 inputFile。不要忘记在 if(outputFile==NULL) 中调用 fclose(inputFile)。
  • Marcelo,这对我来说并不明显,否则我会把其余的代码放在那里......谢谢迈克尔,我没想到。

标签: c glibc fclose


【解决方案1】:

问题可能出在此部分:

 /* ... read in inputFile ... */

你有一些代码破坏了堆。数组溢出是典型的原因。在发生损坏时很少检测到堆损坏。只是稍后,当某些代码分配或释放内存时并且内置了一些基本的堆健康验证。就像 fclose() 一样。

【讨论】:

  • 为什么它不会在第一个 fclose 中拾取它呢?不过还是谢谢你的建议,我对指针不是很精通,那也会导致同样的问题吗?
  • 堆损坏的行为永远无法预测,它完全取决于损坏发生的位置。是的,指针是破坏堆的第一方法。
  • 嗯,这似乎是半可预测的。我已经多次运行程序,第二个 fclose 被注释掉了,它从来没有问题(反正不是 glibc 问题)。感谢您的帮助,这是一个大型程序,所以我看看能否用 valgrind 和 gdb 解决。
【解决方案2】:

要检测准确代码在哪里破坏了堆,如果你在 Linux 上运行,你应该使用valgrind。它易于使用:

valgrind ./myprog arguments ...

并会从发生错误读取或写入的确切点为您提供堆栈跟踪。

Valgrind 可从主要的 Linux 发行版获得,或者您可以从源代码构建。

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2014-01-06
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多