Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
getaddrinfo()返回非零值时是否分配了struct addrinfo**res?_C_Getaddrinfo - Fatal编程技术网

getaddrinfo()返回非零值时是否分配了struct addrinfo**res?

getaddrinfo()返回非零值时是否分配了struct addrinfo**res?,c,getaddrinfo,C,Getaddrinfo,我在一个嵌入式应用程序中遇到一些内存泄漏问题,在查看代码时,我发现当getaddrinfo()返回非零时,我没有释放AddRinfo(): s = getaddrinfo(hostname, port, &hints, &result); if (s != 0) { log_error(); } else { // do stuff freeaddrinfo(result); } 这会导致内存泄漏吗?我曾尝试查看手册页,但它没有明确说明。规范没有说明如果失败,结果不

我在一个嵌入式应用程序中遇到一些内存泄漏问题,在查看代码时,我发现当getaddrinfo()返回非零时,我没有释放AddRinfo():

s = getaddrinfo(hostname, port, &hints, &result);
if (s != 0) {
  log_error();
} else {
  // do stuff
  freeaddrinfo(result);
}

这会导致内存泄漏吗?我曾尝试查看手册页,但它没有明确说明。

规范没有说明如果失败,
结果
不会被分配,因此看起来一致性实现可以这样做

为什么不无条件释放它

result = 0;
s = getaddrinfo(hostname, port, &hints, &result);
if (s) {
    // log error
} else {
    // success
}
if (result) {
    freeaddrinfo(result);
}

理想情况下,您可以调用
freeaddrinfo(result)
,而无需检查
result
是否为空,但尽管标准暗示这没问题,但我不会指望它。

虽然标准确实对此有点模糊,唯一有意义的解释是将错误视为结果的替代品。这是其他libc函数的工作方式,也是示例中甚至在标准中使用
getaddrinfo()
的方式

见:

我认为,除非您正在处理一个已知的已损坏的实现,否则没有必要发明方法来解决这个问题。POSIX函数不要求将用于输出的指针归零,除非另有规定

从以上链接:

成功返回getaddrinfo()后,res指向的位置应参考addrinfo结构的链接列表,每个结构都应指定套接字地址和信息,用于创建使用该套接字地址的套接字


很明显,编写标准时假设在其他情况下,
res
变量未被触及。

您是否尝试过
valgrind
?有很大的机会可以帮助你找到这个bug-它可以告诉你确切的位置,内存是分配的,以后不会释放。@KirilKirov我知道,但这是一个嵌入式设备,valgrind不可用。(我很高兴有一个调试器;))它实际上很容易测试:将结果指针设置为
NULL
,使用您知道会失败的参数调用函数,然后查看指针是否仍然
NULL
。“如果不是这样的话,你也许应该把它释放出来。”巴特弗里德里克斯-哦,我明白了。好吧,祝你好运:)这就是我倾向于的解决办法。