我正在编写一个小型代码来读取插座的ADS-B数据。数据采用以下格式
msg,6,1,1,4242d7,1,2017/12/25,12:04:04:05.695,2017/12/25,12:04:04.695 ,,,,,,,,6142,0,6142,00,0, 味精,4,1,1,80068d,1,2017/12/25,12:04:04:05.695,2017/12/25,12:04:04:05.695 ,, 183,268 味精,2,1,1,1,800b6f,1,2017/12/25,12:04:05.695,2017/12/25,12:04:04:05.695 ,, 7,165,28.5394949,77.10886 ,,- 1 MSG,5,1,1,4242D7,1,2017/12/12/25,12:04:05.695,2017/12/25,12:04:05.696,KAR2440 ,32025 ,,,,0,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] = ' ';
*out = buffer; // complete line
//free(buffer);
return bytesloaded;
}
}
}
}
}
使用以下例程从MAIN调用上述函数
bytesread = readline(netfd,&amp; netbuf);
问题是内存中的代码足迹逐渐增加表示内存泄漏。Valgrind还指向读取功能。如果我散布第二行(免费(缓冲区)),则不会泄漏内存泄漏。但是这样做可以让我输出数据。我在这里缺少什么。
您的设计指示该函数readline
分配了所需的内存并将指针返回到调用功能。
使用此设计,调用功能必须调用free
以避免内存泄漏。
我应该指出,这种设计通常是有问题的,并且增加了内存泄漏的机会。
更好的设计将内存管理问题保持在一起(分配功能应释放内存。当不可能或不切实际时,函数名称应明确表示分配,并且应编写驱动器(即line_alloc
和line_free
),最小化。任何混乱。