Theo câu hỏi, tôi đang gặp sự cố rò rỉ bộ nhớ theo số getnameinfo. Tôi đang sử dụng Ubuntu 12.04 (Linux scv 3.2.0-35-generiC# 55-Ubuntu SMP Thứ tư ngày 5 tháng 12 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux) với gcc phiên bản 4.6.3.
Tôi đang liên kết máy chủ của mình có thể thực thi với g ++ và cho đến nay valgrind chưa báo cáo sự cố. Sau đó tôi đã thêm một cuộc gọi đơn giản tới getnameinfo để in ra tên mạng và cổng kết nối khách hàng là gì.
Và tôi nhận được như sau:Xác nhận rò rỉ bộ nhớ getnameinfo có được xác nhận không?
==4425== ==4425== HEAP SUMMARY: ==4425== in use at exit: 10 bytes in 1 blocks ==4425== total heap usage: 4,508 allocs, 4,507 frees, 134,939,153 bytes allocated ==4425== ==4425== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==4425== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==4425== by 0x50D7D71: strdup (strdup.c:43) ==4425== by 0x1484B861: ??? ==4425== by 0x515B871: [email protected]@GLIBC_2.2.5 (getXXbyYY_r.c:256) ==4425== by 0x5161D06: getnameinfo (getnameinfo.c:223) ==4425== by 0x404175: solsrv_run (solsrv.c:381) ==4425== by 0x404DAC: main (main.c:167) ==4425== ==4425== LEAK SUMMARY: ==4425== definitely lost: 10 bytes in 1 blocks ==4425== indirectly lost: 0 bytes in 0 blocks ==4425== possibly lost: 0 bytes in 0 blocks ==4425== still reachable: 0 bytes in 0 blocks ==4425== suppressed: 0 bytes in 0 blocks ==4425== ==4425== For counts of detected and suppressed errors, rerun with: -v ==4425== ERROR SUMMARY: 12 errors from 11 contexts (suppressed: 2 from 2)
Tôi đang làm gì sai?
Mã chỉ đơn giản là như sau:
struct sockaddr addr;
socklen_t addr_sz = sizeof(addr);
char host[NI_MAXHOST],
serv[NI_MAXSERV];
int infd = accept(srv_fd, (struct sockaddr*)&addr, &addr_sz);
if (infd == -1) {
... manage error on accept ...
}
if(getnameinfo((struct sockaddr *)&addr, addr_sz, host, NI_MAXHOST, serv, NI_MAXSERV, NI_NUMERICSERV)) {
strncpy(host, "<unknown host>", NI_MAXHOST-1);
strncpy(serv, "<unknown port>", NI_MAXSERV-1);
}
Và ở đó bạn có bị rò rỉ ...
Tôi có thể khẳng định, rằng sự rò rỉ được xảy ra: cho 6 khách hàng kết nối valgrind tìm thấy 60 byte bị rò rỉ (Tôi đoán các khách hàng đang kết nối từ cùng một máy chủ vì vậy nếu nó liên quan đến tên máy chủ thì tốc độ tăng trưởng là tuyến tính như mong đợi).
Bất kỳ ý tưởng nào?
Cheers
Luôn có thể tải xuống nguồn và xem nội dung đang làm. –
Và vì đó là nguồn mở, bạn có thể tự khắc phục sự cố! –
Có thể phải làm điều đó :-) – Emanuele