2014-10-16 2 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; 
} 

Als ich Valgrind auf meinem Mac verwenden (OS X, 10.9.5) ich die folgende Meldung erhalten:zeigt Valgrind Speicherverlust für printf und ungenutzte Blöcke

==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) 

Hat printf Speicher zuweisen selbst? Wenn ich die printf entfernen erhalte ich nur folgendes:

==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) 

Wo kommt die 373 Blöcke kommen aus?

+2

Auf meinem AMD Linux-System heißt es, dass es überhaupt kein Leck gibt. – Jay

Antwort

4

Bis das Valgrind-Team OS X priorisiert, können Sie sicher davon ausgehen, dass es auf Apple-Systemen mit OS X-Versionen neuer als 10.7 keine korrekten Ergebnisse liefert.

Auf meinem Mavericks (10.9.5) Maschine, habe ich noch die folgende Warnung von Valgrind erhalten (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. 

Für das, was es wert ist, Valgrind 3.10.0 zeigt keine Lecks auf meinem Debian Jessie Installation.

0

Es sagt Ihnen nicht, dass es ein Leck: Sie

==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 

es zu sagen, dass es einen Block, der immer noch erreichbar ist; Ob es ein Leck gibt oder nicht, hängt von Ihrer Definition von "Leck" ab. Was es bedeutet, ist, dass irgendwo ein Zeiger auf den Block ist.

Weitere Informationen finden Sie unter Still Reachable Leak detected by Valgrind.