gpt4 book ai didi

c - 谁免费的 setvbuf 缓冲区?

转载 作者:太空狗 更新时间:2023-10-29 17:10:55 24 4
gpt4 key购买 nike

所以我一直在研究 libc 的 stdio 部分是如何实现的,并且遇到了另一个问题。查看 man setvbuf 我看到以下内容:

When the first I/O operation occurs on a file, malloc(3) is called, and a buffer is obtained.

这是有道理的,除非您实际使用它,否则您的程序不应该在 I/O 中包含 malloc。我对此的直觉 react 是 libc 将在这里清理它自己的烂摊子。我只能假设它确实如此,因为 valgrind 报告没有内存泄漏(他们当然可以做一些肮脏的事情而不是直接通过 malloc 分配它......但我们假设它确实使用 malloc 现在)。

但是,您也可以指定自己的缓冲区...

int main() {
char *p = malloc(100);
setvbuf(stdio, p, _IOFBF, 100);
puts("hello world");
}

哦不,内存泄漏! valgrind 证实了这一点。因此,似乎每当 stdio 自己分配一个缓冲区时,它就会被自动删除(最迟在程序退出时,但可能在流关闭时)。但是,如果您明确指定缓冲区,则必须自己清理它。

不过有一个问题。手册页还说:

You must make sure that the space that buf points to still exists by the time stream is closed, which also happens at program termination. For example, the following is invalid:

现在这对标准流来说越来越有趣了。由于它们在程序终止时已关闭,因此如何正确地为它们清理手动分配的缓冲区?我可以想象文件结构中的“关闭标志时清理它”,但它会变得毛茸茸,因为如果我正确阅读它会做这样的事情:

setvbuf(stdout, 0, _IOFBF, 0);
printf("hello ");
setvbuf(stdout, 0, _IOLBF, 0);
printf("world\n");

因为这句话会导致标准库进行 2 次分配:

If the argument buf is NULL, only the mode is affected; a new buffer will be allocated on the next read or write operation.

编辑: 我的问题的附录。因为很明显我必须释放我传递给setvbuf的任何缓冲区,如果我确实在stdout上使用它是否有任何实用的方法免费吗?它必须活到程序结束。我能想到的最好的方法是 fclose(stdout) 然后释放它,或者像某些人提到的那样使用静态缓冲区。我问是因为这看起来确实是一个尴尬的设计决定。

最佳答案

同样来自 man page (至少,在我的系统上):

If buf is not NULL, it is the caller's responsibility to free(3) this buffer after closing the stream.

也就是说,您分配了它,释放了它。

退出前,您可以自己关闭流,从而释放缓冲区。或者,您可以刷新流并使用 NULL 缓冲区参数再次调用 setvbuf 以切换回库管理缓冲区或无缓冲 I/O。

关于c - 谁免费的 setvbuf 缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com