为什么 fprintf 在分配的字节上使用 valgrind 上的这么多内存?

Why does fprintf uses so much memory on valgrind on bytes allocated?

我想了解为什么我的 valgrind 报告我在文件上执行简单的 fprintf 时使用了 8.664 字节:

#include <stdio.h>


int main(){
    FILE* creation = fopen("test.txt", "w+");
    fprintf(creation, "something");
    fclose(creation);
}

valgrind 报告:

==3947== HEAP SUMMARY:
==3947==     in use at exit: 0 bytes in 0 blocks
==3947==   total heap usage: 2 allocs, 2 frees, 8,664 bytes allocated

为什么会这样?

这是您系统上 glibc 的实现细节。

因为它会释放它分配的所有内容,所以您无需担心。

您的 C 库似乎延迟分配与 FILE 对象关联的输出缓冲区,直到实际写入 FILE 时,或者直到您使用 setvbuf 配置缓冲。我在评论中建议的 setvbuf 调用 disables 缓冲,在这种情况下,第二次分配根本不会发生。

8664 - 472 = 8192 或 8 KB 是 FILE 输出缓冲区的合理默认大小。 (为了获得最大 I/O 效率,它需要是 4096 的倍数,这是典型的 VM 页面和磁盘块大小。)如果需要,您可以通过对 setvbuf 的其他调用来调整大小;有关详细信息,请参阅其文档。