首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确克隆struct addrinfo

如何正确克隆struct addrinfo
EN

Stack Overflow用户
提问于 2019-05-20 19:36:28
回答 1查看 197关注 0票数 0

我需要克隆一个现有的struct addrinfo指针。我已经写了下面的代码来克隆它。虽然从功能的角度来看它工作得很好,但当我释放克隆的strutc addrinfo指针时,我得到了内存泄漏。

代码语言:javascript
复制
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报告了以下代码行的内存泄漏。

代码语言:javascript
复制
dst->ai_addr = malloc(src->ai_addrlen);

然后我检查了freeaddrinfo代码,我发现struct addrinfo的ai_addr成员没有显式释放。

也许我在克隆的时候遗漏了一些东西。有人能帮我理解如何正确克隆struct addrinfo吗?

有没有可以克隆struct addrinfo的C api?

EN

回答 1

Stack Overflow用户

发布于 2020-05-13 13:24:26

实际上,getaddrinfo的实现有一个诀窍,它会为rp分配整个内存(sizeof (struct addrinfo) + ai_addrlen),所以freeaddrinfo只会释放rp和rp.ai_canonname。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56220221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档