Valgrind在fclose()中谈到“无效写入”

时间:2015-06-04 13:19:57

标签: c++ memory-management valgrind

我使用fmemopen()创建了一个流。我用fclose()关闭它并在读取后释放缓冲区。 Valgrind在fclose()行报告了问题:

==9323== Invalid write of size 8
==9323==    at 0x52CAE52: _IO_mem_finish (memstream.c:139)
==9323==    by 0x52C6A3E: fclose@@GLIBC_2.2.5 (iofclose.c:63)
==9323==    by 0x400CB6: main (main.cpp:80)
==9323==  Address 0xffefffa80 is just below the stack ptr.  To suppress, 
use: --workaround-gcc296-bugs=yes

发生了什么事?也许fclose()无法正确关闭内存流?或者也许valgrind无缘无故地担心,我可以忽略它?

2 个答案:

答案 0 :(得分:0)

由于您尚未发布您的代码,以下是纯粹的推测。您可能正在向流中写入比您在打开它时所承诺的更多输出。您是否考虑了最终的NUL(如果您没有使用"b"打开)?

您是否在手册页中阅读了以下内容?

  

当已经打开以进行写入的流被刷新(fflush(3))或关闭(fclose(3))时,如果存在,则在缓冲区的末尾写入空字节是空间。调用者应该确保有一个额外的字节          缓冲区(以及size计算该字节)以允许此操作。

     

尝试向缓冲区写入超过size个字节会导致错误。 (默认情况下,只有在刷新stdio缓冲区时才会显示此类错误。使用setbuf(fp, NULL)禁用缓冲可能对检测有用          输出操作时的错误。或者,调用者可以显式设置buf作为stdio流缓冲区,同时使用setbuffer(fp, buf, size)通知stdio缓冲区的大小。)

遵循后一个建议应该显示超出容量的写入。

答案 1 :(得分:0)

这是我的错。我写道,我使用fmemopen()来打开一个流,但是这段代码没有运行,我得到了一个流,先前用open_memstream()生成。虽然这个流是为了写作而开放的,但我可以从中读取。然而valgrind报道了问题。我修复了我的代码,valgrind找不到错误。