2015-06-17 14 views
6

Tôi đang làm việc trên bản sao của các chức năng malloc (3) (malloc, reallocfree hiện tại).Phân bổ tùy chỉnh: Valgrind hiển thị 7 allocs, 0 giải phóng, không có rò rỉ

Tôi muốn thêm hỗ trợ cho Valgrind. Tôi đang sử dụng these docs. Tuy nhiên, sau khi thêm các cuộc gọi đến VALGRIND_MEMPOOL_FREE, VALGRIND_MEMPOOL_ALLOCVALGRIND_CREATE_MEMPOOL macro, tôi nhận được sau từ Valgrind:

==22303== HEAP SUMMARY: 
==22303==  in use at exit: 0 bytes in 0 blocks 
==22303== total heap usage: 7 allocs, 0 frees, 2,039 bytes allocated 
==22303== 
==22303== All heap blocks were freed -- no leaks are possible 

Đây là mặc dù tôi realloc calling VALGRIND_MEMPOOL_FREEfree calling VALGRIND_MEMPOOL_FREE tôi.

Nguyên nhân có thể là gì?

+4

Xem [http://valgrind.10908.n7.nabble.com/VALGRIND-MEMPOOL-FREE-not-reflected-in-heap-summary-td42789.html ] (http://valgrind.10908.n7.nabble.com/VALGRIND-MEMPOOL-FREE-not-reflected-in-heap-summary-td42789.html) và [https://bugs.kde.org/show_bug. cgi? id = 233298] (https://bugs.kde.org/show_bug.cgi?id=233298). – 4566976

Trả lời

5

Nguyên nhân có thể là gì?

Điều này là do lỗi trong valgrind. Xem link đến trình theo dõi lỗi valgrind trong nhận xét của tôi cho câu trả lời của bạn.

Từ khác link trong nhận xét của tôi:

Một tìm kiếm lướt qua mã nguồn chỉ ra rằng MEMPOOL_ALLOC cuộc gọi new_block, có nghĩa là tăng cmalloc_n_mallocs, nhưng không có sự thay đổi tương ứng với cmalloc_n_frees trong MEMPOOL_FREE.

/* valgrind.c */ 
#include <valgrind/valgrind.h> 

int main(int argc, char *argv[]) { 
    char pool[100]; 

    VALGRIND_CREATE_MEMPOOL(pool, 0, 0); 
    VALGRIND_MEMPOOL_ALLOC(pool, pool, 8); 
    VALGRIND_MEMPOOL_FREE(pool, pool); 
    VALGRIND_DESTROY_MEMPOOL(pool); 
    return 0; 
} 

$ gcc valgrind.c -g 
$ valgrind --leak-check=full --show-leak-kinds=all ./a.out 
==10186== Memcheck, a memory error detector 
==10186== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==10186== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info 
==10186== Command: ./a.out 
==10186== 
==10186== 
==10186== HEAP SUMMARY: 
==10186==  in use at exit: 0 bytes in 0 blocks 
==10186== total heap usage: 1 allocs, 0 frees, 8 bytes allocated 
==10186== 
==10186== All heap blocks were freed -- no leaks are possible 
==10186== 
==10186== For counts of detected and suppressed errors, rerun with: -v 
==10186== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
$ 
+0

Điều này thật thú vị, cảm ơn bạn đã gợi ý! Mặc dù tôi không chắc đó có phải là vấn đề hay không. Tôi thấy biến 'cmalloc_n_frees' đang được tăng lên trong phiên bản 3.10, là phiên bản tôi đang sử dụng (phiên bản từ báo cáo lỗi là 3.5 và 3.6). 'cmalloc_n_frees' được tăng lên trong' memcheck/mc_malloc_wrappers.c' tại dòng 479/522 (nguồn: http://valgrind.org/downloads/current.html). Ngoài ra, tôi là một chút hoài nghi về việc làm thế nào các đội ngũ dev Valgrind có thể đã bị mất một lỗi rõ ràng như vậy. Xét cho cùng, báo cáo 'malloc' chuẩn chỉ tốt với Valgrind. Tôi không sử dụng 'DESTROY_MEMPOOL' atm. Nó có cần thiết không? – conradkdotcom

+0

@conradk Hàm liên quan là 'mempool_free' trong dòng 861 trong đó' cmalloc_n_frees' không được tăng lên.'mempool_alloc' trong dòng 832 gọi' new_block' trong đó 'cmalloc_n_mallocs' được tăng lên, nhưng' mempool_free' không gọi 'handle_free' trong đó' cmalloc_n_frees' sẽ được tăng lên. Đội ngũ valgrind dev đã không bỏ lỡ lỗi này. Đó là trong trình theo dõi lỗi của họ, nhưng nó là lạ nó chưa được cố định sau một thời gian dài (hơn năm năm). – 4566976

+0

@conradk 'VALGRIND_DESTROY_MEMPOOL' không thay đổi bất kỳ điều gì trong đầu ra. Tôi đã thêm một ví dụ với nó. – 4566976

0

Taken từ đây: http://valgrind.10908.n7.nabble.com/VALGRIND-MEMPOOL-FREE-not-reflected-in-heap-summary-td42789.html

Một tìm kiếm lướt qua mã nguồn chỉ ra rằng MEMPOOL_ALLOC cuộc gọi new_block, có nghĩa là tăng cmalloc_n_mallocs, nhưng không có sự thay đổi tương ứng với cmalloc_n_frees trong MEMPOOL_FREE. Đây là một bản vá tăng dần vào cuối MEMPOOL_FREE. Điều này cho phép tôi hành vi mà tôi mong đợi.

+0

'Đây là bản vá' Ở đâu? – Mast

+0

http://valgrind.10908.n7.nabble.com/attachment/42790/0/patch –

+0

NẾU bạn copypaste từ các nguồn khác, bạn sẽ đánh dấu văn bản này như là một trích dẫn! – alk

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