C函数fscanf具有内存丢失

时间:2016-08-20 16:50:34

标签: c valgrind

我目前正在使用函数 fscanf 来解析带有一些char和float点的文件。我通过打印出来并使用 valgrind 进行内存检查来确认结果。 现在,打印是正确的,但总有一个绝对丢失的记忆。

这是一个示例代码:

FILE* table;
table = fopen("table", "r");
double mass;
while (fscanf(table, %lf ", &mass) != EOF){
    printf("mass: %lf\n", mass);
}

--leak-check=full选项的valgrind说:

==7104== 513 bytes in 1 blocks are definitely lost in loss record 52 of 62
==7104==    at 0x100008EBB: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==7104==    by 0x1001EF66C: __parsefloat_buf (in /usr/lib/system/libsystem_c.dylib)
==7104==    by 0x1001ED9EF: __svfscanf_l (in /usr/lib/system/libsystem_c.dylib)
==7104==    by 0x1001E1492: fscanf (in /usr/lib/system/libsystem_c.dylib)
==7104==    by 0x100000F3F: main (in ./prtm)

我认为这是格式问题。我还试图使用%ffloat但只是得到更多类似的错误。 谁能告诉我出了什么问题?

1 个答案:

答案 0 :(得分:3)

虽然您没有fclose()提交已发布的代码片段,但我怀疑这是否会造成麻烦。在任何情况下,请确保fclose()文件。

函数fscanf似乎为自己的目的分配内存,并且在程序退出时不释放它。 valgrind通常知道这种不可避免的内存泄漏并抑制输出,因为某些原因它错过了这个。

此消息似乎并未表示代码中存在问题。报告的丢失块由OS / X版本的fscanf()分配,从调用堆栈可以看出,对于其内部浮点解析器__parsefloat_buf

更准确地说,LibC的源代码可以从http://opensource.apple.comLibc-763.11/stdio/vfscanf-fbsd.c:965)获得,并且该块在退出时应该是免费的。

您可以尝试自行释放它,但我不建议将此片段添加到生产代码中。

#include <stdlib.h>
#include <pthread.h>
#include <sys/cdefs.h>

...

free(pthread_getspecific(__LIBC_PTHREAD_KEY_PARSEFLOAT));
pthread_setspecific(__LIBC_PTHREAD_KEY_PARSEFLOAT, NULL);

相反,正如Rad Lexus所指出的,你应该告诉 valgrind 忽略这个警告,如下所示:On OSX Valgrind reports this memory leak, Where is it coming from?