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
的调用,我想要以下两种行为之一:
- 调用 #2
后调用 printf
释放缓冲区 A
- 缓冲区 A 在调用 #3
后通过调用 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似乎没有重新分配内存。
我想知道使用 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
的调用,我想要以下两种行为之一:
- 调用 #2 后调用
- 缓冲区 A 在调用 #3 后通过调用
printf
释放缓冲区 A
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似乎没有重新分配内存。