Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ getaddrinfo内存泄漏_C++_C_Ubuntu_Valgrind_Getaddrinfo - Fatal编程技术网

C++ getaddrinfo内存泄漏

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)

我有以下代码用于获取有关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==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返回的内存,只是意识到你有。