我正在编写一个小代码来从Socket读取ADS-B数据。数据采用以下格式
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,1,80068D,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
字符串由CRLF终止
我目前正在使用readline函数逐行读取套接字中的数据
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;
}
}
}
}
}
使用以下例程从main调用上述函数
byteread = readline(netfd,&netbuf);
问题是内存中的代码占用量逐渐增加,表明内存泄漏。 Valgrind还指出了readline函数。如果我取消注释第二个最后一行(free(buffer)),则没有内存泄漏。但这样做不会给我输出数据。我在这里想念的是什么
您的设计表明函数readline
分配所需的内存并返回指向调用函数的指针。
使用这种设计,调用函数必须调用free
以避免内存泄漏。
我应该指出,这种设计通常存在问题,并增加了内存泄漏的可能性。
更好的设计将内存管理问题放在一起(分配函数应该释放内存。当这不可能或不切实际时,函数名称应该清楚地指出分配并且应该编写析构函数(即line_alloc
和line_free
),从而最大限度地减少混淆。