繁体   English   中英

带有内存丢失的C函数fscanf

[英]C function fscanf with memory loss

我目前正在使用fscanf函数来解析具有一些char和浮点数的文件。 我通过打印出来并用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但是得到了更多类似的错误。 谁能告诉我哪里出了问题?

尽管您没有在发布的代码片段中使用fclose()归档,但我怀疑这会引起麻烦。 无论如何,请确保fclose()该文件。

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

此消息似乎并不表示您的代码有问题。 从调用堆栈可以看出,报告的丢失块由OS / X版本的fscanf()为其内部浮点解析器__parsefloat_buf

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

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

#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忽略此警告,如以下问题所示: 在OSX上,Valgrind报告此内存泄漏,它来自何处?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM