Мне нужно клонировать существующий указатель struct addrinfo. Я написал код ниже, чтобы клонировать его. Хотя это и работает нормально с точки зрения функциональности, но я получаю утечку памяти, когда освобождаю клонированный указатель addrfo strutc.
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, я вижу, что член ai_addr структуры addrinfo явно не освобожден.
Возможно, я что-то упускаю при клонировании. Может ли кто-нибудь помочь мне понять, как правильно клонировать структуру addrinfo.
Есть ли C api для клонирования структуры addrinfo?