Valgrind сообщает, что у getaddrinfo утечка памяти? - PullRequest
3 голосов
/ 16 июля 2011

Я запускал Valgrind в нашем проекте, и valgrind сообщал, что память была потеряна из-за вызова getaddrinfo, несмотря на то, что freeaddrinfo был вызван в нижней части функции.Есть идеи, что может быть причиной этого?

int tcp_connect(char *address, char *port)
{
//printf("%s\n ", address);
    int status, sockfd;
    struct addrinfo hints, *servinfo, *p;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype= SOCK_STREAM;
    status = getaddrinfo(address,port,&hints,&servinfo);
    if(status != 0){
        printf("tcpconnect: getaddrinfo failed\n");
    }
    for(p = servinfo; p != NULL; p = p->ai_next) {
        sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
        if(sockfd == -1){
            printf("tcpconnect: socket failed\n");
            continue;
        }

        status = connect(sockfd, p->ai_addr, p->ai_addrlen);
        if(status == -1){
            close(sockfd);
            printf("tcpconnect: connect failed\n");
            continue;
        }
        break;
    }

    if (p == NULL){
        printf("tcpconnect: could not get a valid socket file descriptor\n");
        return -1;
    }

    freeaddrinfo(servinfo);
    //return socket
    return sockfd;
}

Вывод valgrind находится здесь:

==7803== 384 bytes in 8 blocks are definitely lost in loss record 30 of 37
==7803==    at 0x4023CC8: malloc (vg_replace_malloc.c:236)
==7803==    by 0x413FE46: gaih_inet (in /lib/libc-2.7.so)
==7803==    by 0x4141CA1: getaddrinfo (in /lib/libc-2.7.so)
==7803==    by 0x804D20D: tcp_connect (tcpconnect.c:18)
==7803==    by 0x804D505: update_radio_data_t (radiodata.c:69)
==7803==    by 0x4073368: start_thread (in /lib/libpthread-2.7.so)
==7803==    by 0x4159CFD: clone (in /lib/libc-2.7.so)

Я смущен этой утечкой памяти, потому что я сделал вызов freeaddrinfo внизу.Может ли это быть ошибкой в ​​Valgrind или freeaddrinfo?

Ответы [ 2 ]

8 голосов
/ 16 июля 2011

Ваш путь отказа (if (p == NULL)) не вызывает freeaddrinfo, я бы переместил вызов до проверки.

4 голосов
/ 16 июля 2011
if (p == NULL){
    printf("tcpconnect: could not get a valid socket file descriptor\n");
    return -1;
}

Если это условие когда-либо выполнено, freeaddrinfo(servinfo) не будет вызвано.

...