7

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

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

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

4

2 回答 2

4

规范并没有说result如果失败则不分配,因此似乎符合要求的实现可以这样做。

为什么不无条件释放呢?

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

理想情况下,您可以在freeaddrinfo(result)不检查是否result为 NULL 的情况下调用,但尽管标准暗示没关系,但我不会指望它。

于 2012-08-20T09:48:51.977 回答
2

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

见: http: //pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html

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

从上面的链接:

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

很明显,该标准是在假设在其他情况下res不会触及变量的情况下编写的。

于 2014-03-31T09:39:19.983 回答