getaddrinfo内存泄漏

我有这个代码获取有关IPv4地址的信息:

struct addrinfo hints, *info = NULL; char addr4[INET_ADDRSTRLEN]; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_STREAM; hints.ai_family = AF_INET; if (!getaddrinfo(argv[hostPara], NULL, &hints, &info)) { inet_ntop(AF_INET, &((const sockaddr_in *)info->ai_addr)->sin_addr, addr4, INET_ADDRSTRLEN); } if (info != NULL) { freeaddrinfo(info); } 

但如果我testingargv [hostPara]是“www.google.com”我从valgrind得到这个:

 ==3632== 168 bytes in 1 blocks are still reachable in loss record 1 of 1 ==3632== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==3632== by 0x524B5B8: make_request (check_pf.c:249) ==3632== by 0x524BA53: __check_pf (check_pf.c:342) ==3632== by 0x5201134: getaddrinfo (getaddrinfo.c:2458) ==3632== by 0x40186B: main (trace.cc:214) 

如果argv[hostPara]"www.ubuntu.com" ,则不存在内存泄漏。 这个神奇的行为是什么?

Solutions Collecting From Web of "getaddrinfo内存泄漏"

看起来有点gblic ,这是关于在ipv6的情况下捕捉对象(请看249行)。

正如其他成员所解释的,“可达”本身并不是一个错误,但它可能隐藏了一些错误的情况。 在这种情况下,这不是一个问题,只是一个警告,可能会隐藏一些令人讨厌的东西。

这个警告也被报告给redhat

谷歌的警告,而不是Ubuntu的原因是因为谷歌已经在其服务器上部署了ipv6,而不是ubuntu,然后捕捉不执行。 你可以检查它:

 nslookup -q=AAAA www.google.com and nslookup -q=AAAA www.ubuntu.com 

这可能不是一个内存泄漏(技术上是这样,但你不应该担心),有时库会在第一次为后续调用调用一个函数时分配内存。 如果你愿意,你可以用valgrind 压制这些错误。

从常见问题解答 :

“仍然可达”意味着你的程序可能是好的 – 它没有释放一些可能的内存。 这是相当普遍而且经常是合理的。 如果您不想看到这些报告,请不要使用–show-reachable = yes。

它说“还可以”。 这可能意味着库分配了一些内存缓存或类似的东西,不想释放它。 你可以放心地忽略它,或者至少它需要更多的分析,而不只是说它是内存泄漏。

为什么不同主机之间有区别是任何人猜测。 可能是因为不同的名称服务器需要不同类型的工作。