的getaddrinfo内存泄漏(getaddrinfo memory leak)

2019-08-02 08:02发布

我有用于获取有关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"没有内存泄漏。 这是什么神奇的行为?

Answer 1:

展望了一下gblic ,它是关于对象的IPv6的情况下捕捉(看249线)。

正如其他成员解释说,“仍可达”是不是一个错误本身,而是它可能隐藏着一些越野车的情况。 在这种情况下,它不是一个问题,只是一些可以隐藏一些讨厌的警告。

这个警告也被报道在redhat

警告为谷歌,而不是原因Ubuntu的是东阳谷歌有IPv6的部署在其服务器上和Ubuntu不是,然后不进行捕捉。 你可以检查一下:

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


Answer 2:

这可能不是一个内存泄漏(在技术上它是,但你不应该担心它),有时库分配内存第一次调用函数的后续调用。 你可以有Valgrind的抑制 ,如果你想这些错误。

从常见问题 :

“仍然可达”是指你的程序可能是好的 - 它不释放一些内存它可能有。 这是很常见的,往往是合理的。 不要使用 - 显示,可达= yes如果你不想看到这些报道。



Answer 3:

它说:“仍可达”。 这可能意味着,库分配一些内存高速缓存或类似的东西,不希望释放它。 您可以放心地忽略它,或至少它需要的不仅仅是说这是内存泄漏更多的分析。

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



文章来源: getaddrinfo memory leak