[英]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)
我認為這是格式問題。 我也嘗試過使用%f
和float
但是得到了更多類似的錯誤。 誰能告訴我哪里出了問題?
盡管您沒有在發布的代碼片段中使用fclose()
歸檔,但我懷疑這會引起麻煩。 無論如何,請確保fclose()
該文件。
函數fscanf
似乎是為自己的目的分配內存,並且不會在程序退出時釋放它。 valgrind
通常知道這種不可避免的內存泄漏並抑制輸出,由於某種原因它錯過了這一輸出。
此消息似乎並不表示您的代碼有問題。 從調用堆棧可以看出,報告的丟失塊由OS / X版本的fscanf()
為其內部浮點解析器__parsefloat_buf
。
更准確地說,可從http://opensource.apple.com ( Libc-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.