17

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

4

3 回答 3

11

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

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

此警告也已报告给redhat

警告 google 而不是 ubuntu 的原因是因为 google 在其服务器上部署了 ipv6 而 ubuntu 没有,然后没有执行捕获。您可以通过以下方式进行检查:

nslookup -q=AAAA www.google.com
nslookup -q=AAAA www.ubuntu.com
于 2012-11-05T10:41:09.337 回答
5

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

常见问题解答

“仍然可以访问”意味着您的程序可能没问题——它没有释放它可能拥有的一些内存。这是很常见的,而且通常是合理的。如果您不想看到这些报告,请不要使用 --show-reachable=yes。

于 2012-11-05T10:21:30.970 回答
2

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

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

于 2012-11-05T10:25:28.493 回答