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

Khi tôi sử dụng Valgrind trên máy Mac của tôi (OS X, 10.9.5) tôi nhận được thông báo sau:Valgrind cho thấy rò rỉ bộ nhớ cho printf và khối không sử dụng

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

Liệu printf phân bổ bộ nhớ bằng cách riêng của mình? Nếu tôi loại bỏ các printf tôi chỉ nhận được như sau:

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

Trường hợp không 373 khối đến từ đâu?

+2

Trên hệ thống Linux amd64 của tôi, nó nói rằng không có rò rỉ nào cả. – Jay

Trả lời

4

Cho đến khi nhóm Valgrind ưu tiên OS X, bạn có thể giả định rằng nó sẽ không cung cấp kết quả chính xác trên các hệ thống Apple chạy các phiên bản OS X mới hơn 10.7.

On Mavericks của tôi (10.9.5) máy, tôi vẫn nhận được cảnh báo sau đây từ 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. 

Đối với những gì nó có giá trị, Valgrind 3.10.0 cho thấy không có rò rỉ trên Jessie Debian của tôi cài đặt.

0

Nó không phải là nói cho bạn biết rằng có được một sự rò rỉ:

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

nó nói với bạn rằng đó là một khối mà vẫn còn có thể truy cập; có hay không có rò rỉ phụ thuộc vào định nghĩa của bạn về 'rò rỉ'. Điều đó có nghĩa là có một con trỏ tới khối ở đâu đó.

Tham khảo Still Reachable Leak detected by Valgrind để biết thêm thông tin.

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