C++ getaddrinfo内存泄漏
我有以下代码用于获取有关IPv4地址的信息:C++ getaddrinfo内存泄漏,c++,c,ubuntu,valgrind,getaddrinfo,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)
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==1块中的168字节在丢失记录1(共1个)中仍然可以访问
==3632==at 0x4C2B6CD:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==3632==0x524B5B8:发出请求(检查密码c:249)
==3632==0x524BA53:uuuu check_upf(check_upf.c:342)
==3632==by0x5201134:getaddrinfo(getaddrinfo.c:2458)
==3632==by0x40186b:main(trace.cc:214)
而如果
argv[hostPara]
是“www.ubuntu.com”
则没有内存泄漏。这种神奇的行为是什么?这可能不是内存泄漏(从技术上讲是,但您不必担心),有时库会在第一次调用函数时为后续调用分配内存。如果你愿意,你可以让valgrind来解决这些错误
从:
“仍然可以访问”意味着你的程序可能还可以——它不是免费的
它可能有一些记忆。这是很常见的,而且通常是合理的。
如果不想查看这些报告,请不要使用--show reachable=yes
上面写着“仍然可以到达”。这可能意味着库为缓存或类似的东西分配了一些内存,并且不想释放它。您可以安全地忽略它,或者至少它需要更多的分析,而不仅仅是说它是内存泄漏
为什么不同的主机之间会有差异,这是任何人的猜测。可能是因为不同的名称服务器需要不同类型的工作。看一看,这是关于ipv6情况下的对象捕获(看249行)
正如其他成员所解释的,“仍然可以访问”本身并不是一个错误,但它可能隐藏一些错误情况。在这种情况下,这不是一个问题,只是一个警告,可能隐藏一些肮脏的东西
此警告也已报告给
谷歌而不是ubuntu发出警告的原因是因为谷歌在其服务器上部署了ipv6,而ubuntu没有,然后没有执行捕获。您可以通过以下方式进行检查:
nslookup -q=AAAA www.google.com
nslookup -q=AAAA www.ubuntu.com
可能是因为google.com已经切换到ipv6,而ubuntu.com没有?也就是说,使用google,您可以在addr4中运行缓冲区覆盖。如果您重复调用
getaddrinfo()
/freeaddrinfo()
,那么这算什么?有一种方法可以检查IP dns服务器使用的版本吗?(无内存泄漏)出于调试目的:注释掉对inet\u ntop()
的调用,只需添加一些对getaddrinfo()
/freeaddrinfo()
(尝试查询同一主机以及其他主机,ip4和ip6),并将结果与最初观察到的行为进行比较。有什么不同吗。如果不是,到目前为止给出的答案应该是可以的。考虑使用GETNAMEFION而不是InEntNopTo.它有一个NI_NUMERICHOST标志。嗯,我在学校项目中有这个代码,它可能是负数。因为alloc和free的数量不同==20489==堆摘要:==20489==在出口处使用:1个块中168字节==20489==堆的总使用量:170个alloc,169个free,38042字节allocated@PetrPřikryl我认为您调用getaddrinfo的方式没有任何问题,因此它可能是为getaddrinfo分配的本地内存。这在图书馆里很常见that@PetrPřikryl没关系,我以为你没有释放getaddrinfo返回的内存,只是意识到你有。