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.
'Was fehlt mir hier? Vielleicht ein' free (...); '? – wildplasser
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
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