setvbuf 的内存副作用

Memory side effects of 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. 调用 #2
  2. 后调用 printf 释放缓冲区 A
  3. 缓冲区 A 在调用 #3
  4. 后通过调用 printf 重新分配

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

实际行为是两种期望行为之一吗?

C标准规定(7.19.5.6):

The setvbuf function may be used only after the stream pointed to by stream has been associated with an open file and before any other operation (other than an unsuccessful call to setvbuf) is performed on the stream.

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

您没有指定您使用的平台,但glibc's implementation似乎没有重新分配内存。