Tất cả các chức năng được đề cập trong khối này là các chức năng thư viện. Làm thế nào tôi có thể khắc phục rò rỉ bộ nhớ này?
Nó được liệt kê dưới danh mục " Vẫn có thể truy cập ". (Có thêm 4 cái nữa, rất giống nhau, nhưng có kích cỡ khác nhau)
630 bytes in 1 blocks are still reachable in loss record 5 of 5
at 0x4004F1B: calloc (vg_replace_malloc.c:418)
by 0x931CD2: _dl_new_object (dl-object.c:52)
by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972)
by 0x92EFB6: _dl_map_object (dl-load.c:2251)
by 0x939F1B: dl_open_worker (dl-open.c:255)
by 0x935965: _dl_catch_error (dl-error.c:178)
by 0x9399C5: _dl_open (dl-open.c:584)
by 0xA64E31: do_dlopen (dl-libc.c:86)
by 0x935965: _dl_catch_error (dl-error.c:178)
by 0xA64FF4: __libc_dlopen_mode (dl-libc.c:47)
by 0xAE6086: pthread_cancel_init (unwind-forcedunwind.c:53)
by 0xAE61FC: _Unwind_ForcedUnwind (unwind-forcedunwind.c:126)
Catch: Một khi tôi chạy chương trình của mình, nó không bị rò rỉ bộ nhớ, nhưng nó có thêm một dòng trong đầu ra Valgrind, vốn không có mặt trước đây:
Loại bỏ các sym ở 0x5296fa0-0x52af438 trong /lib/libgcc_s-4.4.4-20100630.so.1 do munmap ()
Nếu rò rỉ không thể được khắc phục, ai đó ít nhất có thể giải thích lý do tại sao dòng munmap () khiến Valgrind báo cáo rò rỉ 0 "vẫn có thể truy cập" không?
Biên tập:
Đây là một mẫu thử nghiệm tối thiểu:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *runner(void *param) {
/* some operations ... */
pthread_exit(NULL);
}
int n;
int main(void) {
int i;
pthread_t *threadIdArray;
n=10; /* for example */
threadIdArray = malloc((n+n-1)*sizeof(pthread_t));
for(i=0;i<(n+n-1);i++) {
if( pthread_create(&threadIdArray[i],NULL,runner,NULL) != 0 ) {
printf("Couldn't create thread %d\n",i);
exit(1);
}
}
for(i=0;i<(n+n-1);i++) {
pthread_join(threadIdArray[i],NULL);
}
free(threadIdArray);
return(0);
}
Chạy với:
valgrind -v --leak-check=full --show-reachable=yes ./a.out