我需要克隆一个现有的addrinfo结构指针。我写了以下代码来克隆它。原本以为从功能上看它可以正常工作,但当我释放克隆的strutc addrinfo指针时,却出现了内存泄漏。
struct addrinfo * transport_clone_addrinfo(struct addrinfo *src)
{
struct addrinfo *dst;
if(src == NULL)
{
return NULL;
}
dst = calloc(1, sizeof(struct addrinfo));
dst->ai_next = NULL;
dst->ai_flags = 0;
dst->ai_family = src->ai_family;
dst->ai_socktype = src->ai_socktype;
dst->ai_protocol = src->ai_protocol;
dst->ai_canonname = NULL;
dst->ai_addrlen = src->ai_addrlen;
dst->ai_addr = malloc(src->ai_addrlen);
memcpy(dst->ai_addr, src->ai_addr, src->ai_addrlen);
return dst;
}
int main(int argc, char **argv)
{
char *ip = "192.168.1.10";
unsigned short port = 5555;
int index;
int ret_val = -1;
char service[8];
struct addrinfo hints;
struct addrinfo *rp = NULL;
struct addrinfo *rp2;
index = sprintf(service, "%u", port);
service[index] = 0;
if(true)
{
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
ret_val = getaddrinfo(ip, NULL, &hints, &rp);
}
else
{
ret_val = getaddrinfo(ip, service, NULL, &rp);
}
if(ret_val != 0)
{
printf("\ngetaddrinfo failed\n");
}
rp2 = transport_clone_addrinfo(rp);
freeaddrinfo(rp);
freeaddrinfo(rp2);
return 0;
}
这样一来,从功能上来说,它就可以正常工作了。但是valgrind报告下面一行代码的内存泄漏。
dst->ai_addr = malloc(src->ai_addrlen);
然后我检查了freeaddrinfo的代码,我看到addrinfo结构的ai_addr成员没有被显式释放。
可能是我在克隆的时候遗漏了什么。谁能帮我了解一下如何正确克隆addrinfo结构。
有没有什么C语言的api可以克隆addrinfo结构?
其实,getaddrinfo的实现有一个技巧,它会为rp malloc整个内存(sizeof (struct addrinfo) + ai_addrlen),所以freeaddrinfo只是释放rp和rp.ai_canonname。