- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
gethostbyname_r
的原型(prototype)是:
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 document 中的示例非常相似以及 gethostname
在 eglibc-2.15 中的实现。
但我注意到,struct hostent
中有h_name
、h_aliases
、h_addr_list
:
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 */
}
因此我想知道不释放那些指针所指的内容是否真的无关紧要。是否有其他机制处理这些内存?
最佳答案
您应该打印出该结构中指针的值,以找出问题的答案。您会发现它们都指向您分配的缓冲区内的数据。
因此,您只需要一个free
就可以释放所有内存。
但是这也意味着在您完成使用或复制您感兴趣的任何数据之前,您不得释放该分配。您在代码中释放得太早了。
关于c - 如果 hostent 中的指针没有被释放,gethostbyname_r 会泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14539077/
我在我的代码中使用 gethostbyname_r() 函数,编译时出现以下错误。 gethostname.cpp:17: 错误:“gethostbyname_r”未在此范围内声明 我的代码: #in
我目前使用的是线程不安全的 gethostbyname 版本,它非常易于使用。你传递主机名,它返回给我地址结构。看起来在 MT 环境中,此版本使我的应用程序崩溃,因此尝试将其替换为 gethostby
我有一个编写的网络实用程序。我正在使用函数 gethostbyname_r。此函数在 Linux 环境下编译良好,但当我尝试在 MAC OS 上编译相同的代码时,出现以下错误: ‘gethostbyn
gethostbyname_r的原型(prototype)是: int gethostbyname_r(const char *name, struct hostent *ret, char
我有一些旧的 Perl 代码,最近在 FreeBSD 机器上停止工作。失败的代码(以最简单的形式)如下所示: #!/usr/local/bin/perl -w use strict; use DBI;
while(do_again) { rc = gethostbyname_r(host, &hbuf, tmp, TMPLEN, &hp, &my_h_errno); if
我是一名优秀的程序员,十分优秀!