2014-10-16 9 views
6
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]){ 
    char *str = malloc(sizeof(char)*5); 
    str = strcpy(str, "test"); 
    printf("%s\n", str); 
    free(str); 
    return 0; 
} 

Gdy używam Valgrind na moim Mac (OS X 10.9.5) pojawia się następujący komunikat:Valgrind pokazujący wyciek pamięci dla printf i nieużywanych bloków

==77215== HEAP SUMMARY: 
==77215==  in use at exit: 29,211 bytes in 374 blocks 
==77215== total heap usage: 451 allocs, 77 frees, 35,160 bytes allocated 
==77215== 
==77215== 4,096 bytes in 1 blocks are still reachable in loss record 76 of 76 
==77215== at 0x66CB: malloc (in /usr/local/Cellar/valgrind/3.10.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) 
==77215== by 0x182855: __smakebuf (in /usr/lib/system/libsystem_c.dylib) 
==77215== by 0x197217: __swsetup (in /usr/lib/system/libsystem_c.dylib) 
==77215== by 0x1B0158: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==77215== by 0x1B06AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==77215== by 0x187B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==77215== by 0x18596F: printf (in /usr/lib/system/libsystem_c.dylib) 
==77215== by 0x100000F2B: main (test.c:8) 
==77215== 
==77215== LEAK SUMMARY: 
==77215== definitely lost: 0 bytes in 0 blocks 
==77215== indirectly lost: 0 bytes in 0 blocks 
==77215==  possibly lost: 0 bytes in 0 blocks 
==77215== still reachable: 4,096 bytes in 1 blocks 
==77215==   suppressed: 25,115 bytes in 373 blocks 
==77215== 
==77215== For counts of detected and suppressed errors, rerun with: -v 
==77215== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 15) 

Czy printf przydzielić pamięci o sobie? Jeśli usunąć printf ja tylko uzyskać następujące:

==77237== HEAP SUMMARY: 
==77237==  in use at exit: 25,115 bytes in 373 blocks 
==77237== total heap usage: 450 allocs, 77 frees, 31,064 bytes allocated 
==77237== 
==77237== LEAK SUMMARY: 
==77237== definitely lost: 0 bytes in 0 blocks 
==77237== indirectly lost: 0 bytes in 0 blocks 
==77237==  possibly lost: 0 bytes in 0 blocks 
==77237== still reachable: 0 bytes in 0 blocks 
==77237==   suppressed: 25,115 bytes in 373 blocks 
==77237== 
==77237== For counts of detected and suppressed errors, rerun with: -v 
==77237== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 15) 

Skąd 373 bloki pochodzą?

+2

Na moim systemie Linux amd64 jest napisane, że w ogóle nie ma wycieku. – Jay

Odpowiedz

4

Do czasu, gdy zespół Valgrind nadadzą priorytet systemowi OS X, można bezpiecznie założyć, że nie da on poprawnych wyników w systemach Apple z wersją OS X nowszą niż 10.7.

Na moich Mavericks (10.9.5) maszyna, wciąż otrzymuję następujące ostrzeżenie z Valgrind (3.9.0)

WARNING: Support on MacOS 10.8/10.9 is experimental and mostly broken. 
WARNING: Expect incorrect results, assertions and crashes. 
WARNING: In particular, Memcheck on 32-bit programs will fail to 
WARNING: detect any errors associated with heap-allocated data. 

Na co warto, Valgrind 3.10.0 nie wykazuje przecieków na temat mojego Debiana Jessie instalacja.

0

To nie jest informacją, że jest przeciek:

==77215== LEAK SUMMARY: 
==77215== definitely lost: 0 bytes in 0 blocks 
==77215== indirectly lost: 0 bytes in 0 blocks 
==77215==  possibly lost: 0 bytes in 0 blocks 
==77215== still reachable: 4,096 bytes in 1 blocks 
==77215==   suppressed: 25,115 bytes in 373 blocks 

to z informacją, że istnieje blok, który jest nadal osiągalny; czy wyciek jest zależny od twojej definicji "wycieku". Co to znaczy, że gdzieś znajduje się wskaźnik do bloku.

Aby uzyskać więcej informacji, patrz Still Reachable Leak detected by Valgrind.