C语言 setvbuf的记忆副作用



我想知道使用 setvbuf 函数会产生什么样的副作用。

一个示例用例:

setvbuf(stdout, NULL, _IOFBF, BUFSIZ); // Call #1
// Many calls to fprintf(stdout, ...);
setvbuf(stdout, NULL, _IONBF, BUFSIZ); // Call #2
// Many calls to fprintf(stdout, ...);
setvbuf(stdout, NULL, _IOFBF, BUFSIZ); // Call #3
// More calls to fprintf(stdout, ...);

鉴于缓冲区 A 与调用 #1 之后的printf调用一起分配,我需要以下两种行为之一:

  1. 缓冲区 A 在调用 #2 后通过对printf的调用释放
  2. 缓冲区 A 在调用 #3 之后通过对printf的调用重新分配

我不希望发生的事情是缓冲区 A 不被释放或重新分配,从而给我内存泄漏。

实际行为是两种所需行为之一吗?

C 标准指定 (7.19.5.6):

setvbuf 函数只能在流指向 流已与打开的文件相关联,并且先于任何其他文件 操作(对 setvbif 的失败调用除外)在 流。

因此,像您一样在同一流上反复调用setvbuf是未定义的行为。

您没有指定您在哪个平台上,但 glibc 的实现似乎没有重新分配内存。

最新更新