继续为printf
和scanf
语句获取内存泄漏。我根本不需要泄漏。当我运行报告时,它说我在print语句和scan语句中得到了可达到的泄漏。我的问题是如何修复泄漏?
这是valgrind报告:
kidslove-MacBook:src kidslove $ valgrind --leak-check = full --show-leak-kinds = all ./a.out
==6405== Memcheck, a memory error detector
==6405== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==6405== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==6405== Command: ./a.out
==6405==
Enter File Name: input2.txt
1. Print the array sorted by street.
2. Print the array sorted by city.
3. Print the array sorted by state then city
4. Print the array sorrted by zip.
5. Quit
--> 5
==6405==
==6405== HEAP SUMMARY:
==6405== in use at exit: 42,554 bytes in 422 blocks
==6405== total heap usage: 513 allocs, 91 frees, 53,707 bytes allocated
==6405==
==6405== 4,096 bytes in 1 blocks are still reachable in loss record 77 of 78
==6405== at 0x1000076C1: malloc (vg_replace_malloc.c:303)
==6405== by 0x1001F1836: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x100206387: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x10022075D: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x100220C80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1001F6B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1001F49D7: printf (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1000010B3: openFile (hw5.c:15)
==6405== by 0x100001CD5: main (cscd240hw5.c:9)
==6405==
==6405== 4,096 bytes in 1 blocks are still reachable in loss record 78 of 78
==6405== at 0x1000076C1: malloc (vg_replace_malloc.c:303)
==6405== by 0x1001F1836: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1001F4E99: __srefill0 (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1001F4F94: __srefill (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1001FC00D: __svfscanf_l (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1001F515D: scanf (in /usr/lib/system/libsystem_c.dylib)
==6405== by 0x1000010C8: openFile (hw5.c:16)
==6405== by 0x100001CD5: main (cscd240hw5.c:9)
==6405==
==6405== LEAK SUMMARY:
==6405== definitely lost: 0 bytes in 0 blocks
==6405== indirectly lost: 0 bytes in 0 blocks
==6405== possibly lost: 0 bytes in 0 blocks
==6405== still reachable: 8,192 bytes in 2 blocks
==6405== suppressed: 34,362 bytes in 420 blocks
==6405==
==6405== For counts of detected and suppressed errors, rerun with: -v
==6405== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 15)
我的程序的一部分是返回漏洞:
FILE *openFile() {
char name[20];
FILE *fin;
do {
printf("Enter File Name: "); //line 15 leak
scanf("%s", name); // line 16 leak
fin = fopen(name, "r");
}while(fin == NULL);
return fin;
}
原始电话是:
fin = openFile();
答案 0 :(得分:3)
系统上的标准C库似乎没有打扰释放stdio使用的缓冲区。这没什么好担心的。当程序退出时,系统会释放内存。
通常,操作系统提供的valgrind包含有抑制文件,告诉valgrind不报告大量的预期泄漏。要么你正在使用非标准的valgrind包,你已经禁用了标准的抑制,或者在那个系统上构建valgrind的人都没有打扰。