我使用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无缘无故地担心,我可以忽略它?
答案 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找不到错误。