c - C 套接字读取函数造成内存泄漏

标签 c sockets gcc memory-leaks valgrind

我正在编写一段小代码来从套接字读取 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 调用上述函数

bytesread=readline(netfd, &netbuf);

问题是内存中的代码占用量逐渐增加,表明存在内存泄漏。 Valgrind 还提到了 readline 函数。 如果我取消注释倒数第二行(free(buffer)),则不会出现内存泄漏。但这样做不会给我输出任何数据。 我在这里缺少什么。

最佳答案

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

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

我应该指出,这种设计经常存在问题,并且增加了内存泄漏的机会。

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

关于c - C 套接字读取函数造成内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47968561/

相关文章:

c - strptime 不适用于时区格式说明符

c - float[] 数组的平均值(Intel 8086)

flash - 跨域XML和Flash

c++ - 如何在 MinGW 中启用实验性 C++11 并发功能?

c++ - cmake 如何知道包含文件和库在哪里?

c - 在Unix/Linux shell编程:the difference between > and >&

c - 具有不同格式说明符的 scanf 函数的不同行为

c++ - 客户端的socket编程

python - Tornado 相当于 Twisted 的 dataReceived 吗?

c - 如何将 SIMD int vector 转换为在 GCC 中 float ?