您好,匿名用户
随意问技术百科期待您的加入

在gethostbyname_r后不管塞给它的hostent,是否会有内存泄漏问题?

0 投票
int gethostbyname_r(const char *name,
        struct hostent *ret, char *buf, size_t buflen,
        struct hostent **result, int *h_errnop);

为了避开非线程安全的gethostbyname,想用这货,用起来类似这样:

int host2addr(const char *host, struct in_addr *addr) {
    struct hostent he, *result;
    int herr, ret, bufsz = 512;
    char *buff = NULL;
    do {
        char *new_buff = (char *)realloc(buff, bufsz);
        if (new_buff == NULL) {
            free(buff);
            return ENOMEM;
        }   
        buff = new_buff;
        ret = gethostbyname_r(host, &he, buff, bufsz, &result, &herr);
        bufsz *= 2;
    } while (ret == ERANGE);
    if (ret == 0 && result != NULL) 
        *addr = *(struct in_addr *)he.h_addr;
    else if (result != &he) 
        ret = herr;
    free(buff);
    return ret;
}

基本上跟GNU官方文档里的例子一致(GNU的还少了个free的样子)。

但是对hostent还是不太放心:

struct hostent {
   char  *h_name;            /* official name of host */
   char **h_aliases;         /* alias list */
   int    h_addrtype;        /* host address type */
   int    h_length;          /* length of address */
   char **h_addr_list;       /* list of addresses */
}
#define h_addr h_addr_list[0] /* for backward compatibility */

这里面有h_name,h_aliases,h_addr_list ... 我又翻看了下eglibc-2.15的gethostbyname的源码,逻辑基本上跟我上面这段一样。但是,这些东西没释放的话,真的没问题吗?

用户头像 提问 2013年 12月5日 @ Kennen 上等兵 (442 威望)
分享到:

1个回答

0 投票
 
最佳答案

stackoverflow得到答案了...

You should print out the values of the pointers in that struct to find out the answer to your question. You'll discover that they all point to data inside the buffer you allocated.

So a single free is all you need to free up all the memory.

But this also means that you must not free that allocation until you've finished using or copying whatever data you're interested in.

用户头像 回复 2013年 11月23日 @ 随意问站长 上等兵 (310 威望)
选中 2013年 9月7日 @Kennen
提一个问题:

相关问题

0 投票
1 回复 15 阅读
用户头像 提问 2014年 4月8日 @ Trundle 上等兵 (301 威望)
0 投票
1 回复 43 阅读
用户头像 提问 2012年 12月1日 @ Shyvana 上等兵 (214 威望)
0 投票
1 回复 60 阅读
0 投票
1 回复 1 阅读
用户头像 提问 2014年 6月7日 @ 河蟹 列兵 (96 威望)
0 投票
1 回复 38 阅读
用户头像 提问 2012年 12月1日 @ Talon 上等兵 (294 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...