我目前正在使用函数 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)
我认为这是格式问题。我还试图使用%f
和float
但只是得到更多类似的错误。
谁能告诉我出了什么问题?
答案 0 :(得分:3)
虽然您没有fclose()
提交已发布的代码片段,但我怀疑这是否会造成麻烦。在任何情况下,请确保fclose()
文件。
函数fscanf
似乎为自己的目的分配内存,并且在程序退出时不释放它。 valgrind
通常知道这种不可避免的内存泄漏并抑制输出,因为某些原因它错过了这个。
此消息似乎并未表示代码中存在问题。报告的丢失块由OS / X版本的fscanf()
分配,从调用堆栈可以看出,对于其内部浮点解析器__parsefloat_buf
。
更准确地说,LibC的源代码可以从http://opensource.apple.com(Libc-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?