我想知道使用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
的调用,我想要两种行为之一:
printf
释放缓冲区A.
printf
重新分配缓冲区A.
醇>
我不希望发生的事情是缓冲区A没有被释放或重新分配,给我一个内存泄漏。
实际行为是否是两种所需行为之一?
答案 0 :(得分:3)
C标准规定(7.19.5.6):
setvbuf函数只能在指向的流之后使用 stream已与打开的文件相关联,之前与其他任何文件相关联 执行操作(除了对setvbuf的不成功调用之外) 流。
因此,在同一个流上重复调用setvbuf
是未定义的行为。
您没有指定您所使用的平台,但glibc's implementation似乎没有重新分配内存。