Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Memory Leak?

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228

    Cool Memory Leak?

    Ich habe ein Problem, splint meldet bei dem Code 2 Memory leaks. Ich sehe da aber keine. Ich habe noch eine 2te Version geschrieben, da wird nur 1 Memory-Leak gemeldet, vielleicht könnt ihr mir ja helfen:

    Code:
    int main(int argc, char *argv[])
    {
        int sockfd, n;
        struct addrinfo hints, *res, *ressave;
    
        if( argc != 3)
        {
           fprintf(stderr, "usage: %s host port\n", argv[0]);
           return -1;
        }
        memset(&hints, 0, sizeof(struct addrinfo));
    
        hints.ai_family= AF_INET;
        hints.ai_socktype = SOCK_STREAM;
    
        if( (n = getaddrinfo(argv[1], argv[2], &hints, &res)) != 0)
        {
           fprintf(stderr, "error for %s, %s : %s\n", argv[1], argv[2], gai_strerror(n));
           return -1;
        }
    
        ressave = res;
    
        do
        {
           sockfd = socket(res->ai_family, res-> ai_socktype, res->ai_protocol);
           if( sockfd < 0)
              continue;
    
           if( connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)
              break;
           close(sockfd);
        } while ((res = res->ai_next) != NULL);
    
        if(res == NULL)
        {
           fprintf(stderr, "socket/connect failed\n");
           return -1;
        }
    
        freeaddrinfo(ressave);
        shell(sockfd);
    
        close(sockfd);
    
        return 0;
    }
    Ein Memory-Leak wird in Verbindung mit hints angezeigt und eins bei gai_strerror(n).

    Code:
    int main(int argc, char *argv[])
    {
        int sockfd, n;
        struct addrinfo *hints, *res, *ressave;
    
    
    
        if( argc != 3)
        {
           fprintf(stderr, "usage: %s host port\n", argv[0]);
           return -1;
        }
    
    
        hints= (struct addrinfo *)malloc(sizeof(struct addrinfo));
        memset(hints, 0, sizeof(struct addrinfo));
    
        hints->ai_family= AF_INET;
        hints->ai_socktype = SOCK_STREAM;
    
        if( (n = getaddrinfo(argv[1], argv[2], hints, &res)) != 0)
        {
           fprintf(stderr, "error for %s, %s : %s\n", argv[1], argv[2], gai_strerror(n));
           free(hints);
           return -1;
        }
    
        ressave = res;
    
        do
        {
           sockfd = socket(res->ai_family, res-> ai_socktype, res->ai_protocol);
           if( sockfd < 0)
              continue;
    
           if( connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)
              break;
           close(sockfd);
        } while ((res = res->ai_next) != NULL);
    
        if(res == NULL)
        {
           fprintf(stderr, "socket/connect failed\n");
           free(hints);
           return -1;
        }
    
        free(hints);
        freeaddrinfo(ressave);
        shell(sockfd);
    
        close(sockfd);
    
        return 0;
    }
    hier wird nur noch ein Memory-Leak bei gai_strerror(n) angezeigt.

    danke - Steve

    PS welche Version ist denn überhaupt besser, die 1te oder die 2te ?
    pornstars-online.de

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hmm, vielleicht erzeugt gai_strerror den Rückgabestring mit malloc und du musst ihn freigeben.

    Ließe sich einfach testen, wenn du zwei mal gai_strerror mit den selben Error Code aufrufst und dabei zwei verschiedene Pointer erhältst.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    Er nutzt malloc noch calloc. Hab ich gestestet und hier noch ein Link dazu :
    http://cvs.parisc-linux.org/glibc/sy...th_tag=current

    Was ist mit dem anderen Leak ?

    Steve
    pornstars-online.de

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von Badsteve

    Was ist mit dem anderen Leak ?
    Die Struktur ist am Stack, sollte also selbst nicht leaken.

    Aber sie enthält Pointer, die vielleicht gelöscht werden müssen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    gut

    danke - Steve
    pornstars-online.de

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •