内存丢失的 C 函数 fscanf
C function fscanf with memory loss
我目前正在使用函数 fscanf 来解析包含一些字符和浮点数的文件。我通过打印出来并使用 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
但只是得到更多类似的错误。
谁能告诉我哪里出了问题?
虽然您没有fclose()
将文件中的代码片段贴出来,我怀疑这是在造成麻烦。无论如何,请确保您 fclose()
文件。
函数fscanf
似乎为自己的目的分配内存,并且在程序退出时不释放它。 valgrind
通常知道这种不可避免的内存泄漏并抑制输出,由于某种原因它错过了这个。
此消息似乎并不表示您的代码中存在问题。从调用堆栈可以看出,报告的丢失块由 fscanf()
的 OS/X 版本分配,用于其内部浮点解析器 __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?
我目前正在使用函数 fscanf 来解析包含一些字符和浮点数的文件。我通过打印出来并使用 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
但只是得到更多类似的错误。
谁能告诉我哪里出了问题?
虽然您没有fclose()
将文件中的代码片段贴出来,我怀疑这是在造成麻烦。无论如何,请确保您 fclose()
文件。
函数fscanf
似乎为自己的目的分配内存,并且在程序退出时不释放它。 valgrind
通常知道这种不可避免的内存泄漏并抑制输出,由于某种原因它错过了这个。
此消息似乎并不表示您的代码中存在问题。从调用堆栈可以看出,报告的丢失块由 fscanf()
的 OS/X 版本分配,用于其内部浮点解析器 __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?