我想知道使用 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
调用一起分配,我需要以下两种行为之一:
- 缓冲区 A 在调用 #2 后通过对
printf
的调用释放 - 缓冲区 A 在调用 #3 之后通过对
printf
的调用重新分配
我不希望发生的事情是缓冲区 A 不被释放或重新分配,从而给我内存泄漏。
实际行为是两种所需行为之一吗?
C 标准指定 (7.19.5.6):
setvbuf 函数只能在流指向 流已与打开的文件相关联,并且先于任何其他文件 操作(对 setvbif 的失败调用除外)在 流。
因此,像您一样在同一流上反复调用setvbuf
是未定义的行为。
您没有指定您在哪个平台上,但 glibc 的实现似乎没有重新分配内存。