C插座读取功能的内存泄漏



我正在编写一个小型代码来读取插座的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_allocline_free),最小化。任何混乱。

最新更新