C套接字读取功能导致内存泄漏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C套接字读取功能导致内存泄漏相关的知识,希望对你有一定的参考价值。

我正在编写一个小代码来从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=='
')
                        break;
                    buffer[bytesloaded] = buf;
                    bytesloaded++;
                }
                buffer[bytesloaded] = '';
                *out = buffer; // complete line
        //free(buffer);
                return bytesloaded;
            }
        }
    }
}
}

使用以下例程从main调用上述函数

byteread = readline(netfd,&netbuf);

问题是内存中的代码占用量逐渐增加,表明内存泄漏。 Valgrind还指出了readline函数。如果我取消注释第二个最后一行(free(buffer)),则没有内存泄漏。但这样做不会给我输出数据。我在这里想念的是什么

答案

您的设计表明函数readline分配所需的内存并返回指向调用函数的指针。

使用这种设计,调用函数必须调用free以避免内存泄漏。

我应该指出,这种设计通常存在问题,并增加了内存泄漏的可能性。

更好的设计将内存管理问题放在一起(分配函数应该释放内存。当这不可能或不切实际时,函数名称应该清楚地指出分配并且应该编写析构函数(即line_allocline_free),从而最大限度地减少混淆。

以上是关于C套接字读取功能导致内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

在片段中保存活动实例:是否会导致内存泄漏?

使用导致内存泄漏的音频片段

带有 UI 和内存泄漏的保留片段

为啥并行读取数组会导致内存泄漏?

访问指向结构的指针会导致内存读取冲突

如何使用模块化代码片段中的LeakCanary检测内存泄漏?