2017-12-25 20 views
-1

Ich schreibe einen kleinen Code zum Lesen von ADS-B-Daten aus einem Socket. Die Daten sind im folgenden FormatSpeicherleck von C Socket Read Funktion

MSG, 6,1,1,4242D7,1,2017/12/25,12: 04: 05,695,2017/12/25,12: 04: 05,695 ,,, ,,,, 6142,0,0,0, MSG, 4,1,180068D, 1,2017/12/25,12: 04: 05,695,2017/12/25,12: 04: 05,695, ,, 183,268 ,,, - 576 ,,,,, 0 MSG, 2,1,1,800B6F, 1,2017/12/25,12: 04: 05,695,2017/12/25,12: 04: 05,695, ,, 7,165,28,53949,77,10886 ,,,,,,, - 1 MSG, 5,1,1,4242D7,1,2017/12/25,12: 04: 05,695,2017/12/25,12: 04: 05,696, KAR2440 , 32025 ,,,,,,, 0, 0

Die Saiten werden durch CRLF

I derzeit bin mit einem Readline- Funktion, um die Daten aus der Buchse zeilen

int readline(int fd, char ** out) 
{ 
    /* Keep reading till header "MSG" is received 
* store it in buffer 
* keep reading till newline is encountered 
* exit function 
*/ 
int buf_size = 512; 
int bytesloaded = 0; 
int ret; 
char buf; 
char * buffer = malloc(buf_size * sizeof(*buffer)); 
if (NULL == buffer) 
{ 
    free(buffer); 
    return -1; 
} 
//loop till header is received 
while (1) 
{ 
    bzero(buffer,buf_size); 
    ret = read(fd, &buf, 1); 
    if (ret < 0) 
    { 
     free(buffer); 
     return -1; 
    } 
    if (buf=='M') //Got M; now wait for S 
    { 
     bytesloaded=0; 
     buffer[bytesloaded] = buf; 
     bytesloaded++; 
     ret = read(fd, &buf, 1); 
     if (ret < 1) 
     { 
      free(buffer); 
      return -1; 
     } 
     if (buf=='S') //Got S; now wait for G 
     { 
      buffer[bytesloaded] = buf; 
      bytesloaded++; 
      ret = read(fd, &buf, 1); 
      if (ret < 1) 
      { 
       free(buffer); 
       return -1; 
      } 
      if (buf=='G') //Got G; now wait for CR-LF 
      { 
       buffer[bytesloaded] = buf; 
       bytesloaded++; 
       while(1) 
       { 
        ret = read(fd, &buf, 1); 
        if (ret < 1) 
        { 
         free(buffer); 
         return -1; 
        } 
        if (buf=='\n') 
         break; 
        buffer[bytesloaded] = buf; 
        bytesloaded++; 
       } 
       buffer[bytesloaded] = '\0'; 
       *out = buffer; // complete line 
     //free(buffer); 
       return bytesloaded; 
      } 
     } 
    } 
} 
} 

Die obige Funktion von Haupt aufgerufen wird unter Verwendung der folgenden Routine

bytesread = Readline- (netfd, & zu lesen, netbuf);

Das Problem ist, dass der Code-Fußabdruck im Speicher allmählich zunimmt, was auf ein Speicherleck hinweist. Valgrind verweist auch auf die Readline-Funktion. Es gibt keinen Speicherverlust, wenn ich die vorletzte Zeile (frei (Puffer)) auskommentiere. Aber das gibt mir keine Daten bei der Ausgabe. Was fehlt mir hier.

+0

'Was fehlt mir hier? Vielleicht ein' free (...); '? – wildplasser

+0

Das zweite Argument zur Funktion' int readline (int fd, char ** out) 'sollte eine Variable sein Platz auf dem Stapel der aufrufenden Funktion, dh das 2. Argument sollte ein Array von 512 Bytes sein, und im Code wird nur der Zeiger auf den lokal zugewiesenen Puffer '* out = buffer; memcpy() 'vor dem Freigeben des' Puffer'-Zeigers . – Gaurav

+0

Ein sehr nettes Werkzeug, das ich benutzte, wenn ich diese Art von Problemen in C hatte, ist [Dr. Speicher] (http://drmemory.org/). Es wird Ihnen helfen, das Speicherproblem zu analysieren und zu lösen. – Yonlif

Antwort

1

Ihr Design zeigt an, dass die Funktion readline den benötigten Speicher belegt und einen Zeiger auf die aufrufende Funktion zurückgibt.

Bei diesem Design muss die aufrufende Funktion free aufrufen, um ein Speicherleck zu vermeiden.

Ich sollte darauf hinweisen, dass dieses Design oft problematisch ist und die Chancen für Speicherlecks erhöht.

Ein besseres Design zusammen Bedenken Speicherverwaltung hält (die Aufteilung der Funktion den Speicher frei sollte. Wenn dies nicht möglich oder nicht praktikabel ist, sollte der Name der Funktion (dh line_alloc und line_free zeigen deutlich, sollte die Zuordnung und eine destructor geschrieben werden),