2015-05-28 122 views
5

保持printfscanf语句的可达内存泄漏。我需要没有泄漏。当我运行报告时,它说我在打印语句和扫描语句中得到了可达性泄漏。我的问题是如何修复泄漏?Valgrind内存泄漏可达

这里是Valgrind的报告:

kidslove-的MacBook:SRC kidslove $的valgrind --leak检查=全 - 显示,泄漏种=所有./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

'fopen' without'fclose' –

+0

来电者将关闭它。 –

+0

@Ôrel:报告指向printf/scant。其中一个人会希望fclose在其他地方...... –

回答

3

系统上的标准C库似乎不打扰stdio使用的释放缓冲区。这是没有什么可担心的。当您的程序退出时,系统释放内存。

操作系统提供的valgrind包通常包含压缩文件,告诉valgrind不会报告大量这些预期的泄漏。要么你使用的是非标准的valgrind包,你已经禁用了标准压制,或者在该系统上构建valgrind的人没有打扰。