getaddrinfo内存泄漏

时间:2012-11-05 10:11:17

标签: c++ c ubuntu valgrind 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);
}

但如果我测试了argv [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"则没有内存泄漏。这种神奇的行为是什么?

3 个答案:

答案 0 :(得分:11)

看一下gblic,它是关于ipv6(看249行)的对象捕获。

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

此警告也已报告给redhat

谷歌警告而不是ubuntu的原因是因为谷歌已经在其服务器和ubuntu上部署了ipv6,然后没有执行捕获。您可以查看:

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

答案 1 :(得分:5)

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

来自FAQ

  

"仍然可以到达"意味着你的程序可能没问题 - 它没有免费   它可能有一些记忆。这很常见,而且往往是合理的。   如果您不想看到这些报告,请不要使用--show-reachable = yes。

答案 2 :(得分:2)

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

为什么不同的主机之间存在差异,任何人猜测。可能是因为不同的名称服务器需要不同类型的工作。

相关问题