setvbuf的内存副作用

时间:2015-03-15 16:20:59

标签: c output-buffering

我想知道使用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, ...);

鉴于在调用#1之后缓冲区A被分配了对printf的调用,我想要两种行为之一:

  1. 在呼叫#2
  2. 之后调用printf释放缓冲区A.
  3. 在呼叫#3
  4. 之后,通过调用printf重新分配缓冲区A.

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

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

1 个答案:

答案 0 :(得分:3)

C标准规定(7.19.5.6):

  

setvbuf函数只能在指向的流之后使用   stream已与打开的文件相关联,之前与其他任何文件相关联   执行操作(除了对setvbuf的不成功调用之外)   流。

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

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