簡體   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