gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:06:28 26 4
gpt4 key购买 nike

我正在编写一段小代码来从套接字读取 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com