首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >getaddrinfo内存泄漏

getaddrinfo内存泄漏
EN

Stack Overflow用户
提问于 2012-11-05 18:11:17
回答 2查看 3.8K关注 0票数 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",则不会发生内存泄漏。这是什么神奇的行为?

EN

回答 2

Stack Overflow用户

发布于 2012-11-05 18:41:09

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

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

此警告也已报告给redhat

对谷歌而不是对ubuntu发出警告的原因是因为谷歌在其服务器上部署了ipv6,而ubuntu没有,然后捕获就不执行了。您可以使用以下命令进行检查:

nslookup -q=AAAA www.google.com
nslookup -q=AAAA www.ubuntu.com
票数 11
EN

Stack Overflow用户

发布于 2012-11-05 18:25:28

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13229913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档