2015-05-28 19 views
5

Tiếp tục rò rỉ bộ nhớ có thể truy cập cho câu hỏi printfscanf. Tôi cần không có rò rỉ nào cả. Khi tôi chạy báo cáo, nó nói rằng tôi nhận được các rò rỉ có thể truy cập tại một tuyên bố in và báo cáo quét. Câu hỏi của tôi là làm cách nào để sửa lỗi rò rỉ?Lỗ hổng bộ nhớ Valgrind Có thể truy cập

Dưới đây là báo cáo valgrind:

kidslove-MacBook: src kidslove $ valgrind --leak kiểm tra = đầy đủ --show-rò rỉ-loại = tất cả ./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) 

Một phần của chương trình của tôi được trả lại rò rỉ:

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; 

} 

cuộc gọi ban đầu hạnh phúc:

fin = openFile(); 
+0

'fopen' không có' fclose' –

+0

Người gọi sẽ đóng. –

+0

@ Ôrel: điểm báo cáo tại printf/scant. Và người ta sẽ hy vọng rằng fclose là ở nơi khác ... –

Trả lời

3

Thư viện C chuẩn trên hệ thống của bạn dường như không bận tâm giải phóng bộ đệm mà stdio sử dụng. Không có gì phải lo lắng cả. Hệ thống giải phóng bộ nhớ khi chương trình của bạn thoát.

Thông thường các gói cho valgrind được cung cấp bởi hệ điều hành chứa các tệp đàn áp thông báo cho valgrind không báo cáo nhiều sự rò rỉ dự kiến. Hoặc là bạn đang sử dụng một gói valgrind không chuẩn, bạn đã vô hiệu hóa các lệnh cấm tiêu chuẩn hoặc bất cứ ai xây dựng valgrind trên hệ thống đó đều không bận tâm.

Các vấn đề liên quan