getaddrinfo()返回非零值时是否分配了struct addrinfo**res?
我在一个嵌入式应用程序中遇到一些内存泄漏问题,在查看代码时,我发现当getaddrinfo()返回非零时,我没有释放AddRinfo():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); } 这会导致内存泄漏吗?我曾尝试查看手册页,但它没有明确说明。规范没有说明如果失败,结果不
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
。“如果不是这样的话,你也许应该把它释放出来。”巴特弗里德里克斯-哦,我明白了。好吧,祝你好运:)这就是我倾向于的解决办法。