c变量char*不会释放



所以我正在编写一个函数,它从文件中提取一行并打印出来,问题是我无法释放char*变量,这是代码

int main()
{
char *line; 
int fd;
fd = open("text.txt", O_RDONLY);
int ret = 0;
while (ret < 3)
{
get_next_line(fd, &line);
printf("%sn", line);
free(line);
ret++;
}
}

它在带有函数的get_next_line函数中分配的行变量

strdup("");

这是get_next_line函数

int get_next_line(int fd, char **line)
{
char *buff;
int bwr;
char *ptr;
int bol;
static char *rem;

bol = 1; 
buff = (char *)malloc(sizeof(char) * (BUFFER_SIZE + 1));
if(rem)
{
*line = ft_strdup(rem);
printf("---1ST---%sn", rem);
free(rem);
printf("---2ND---%sn", rem);
}
else
*line = ft_strdup("");
while (bol && (bwr = read(fd, buff, BUFFER_SIZE)))
{
buff[bwr] = '';
if ((ptr = ft_strchr(buff, 'n')))
{
rem = ft_strdup(ptr + 1);
*ptr = ''; 
bol = 0;
}
*line = ft_strjoin(*line ,buff);
}
return(0);
}

所以我不知道为什么它不能释放线

附言:我正在用lldb检查内存块,谢谢。

我只想解决程序中的泄漏问题:第一个在这一行:

*line = ft_strjoin(*line ,buff);
ft_strjoin的返回值是*line*line用来指向的旧内存地址在没有释放的情况下丢失,现在*line指向另一个内存地址(保存*line + buff的地址(。

你有两种方法来纠正这个问题:

第一个是做这样的事情:

char *to_free = *line;
*line = ft_strjoin(*line, buff);
free(to_free);

这将使to_free指向*line在被ft_strjoin的调用更改之前指向的相同内存地址。另一种方法(在我看来更好的方法(是实现ft_strjoin,它采用一个三维参数int n,例如,如果n = 1释放了ft_strjoin的第一个参数,如果n = 2释放了第二个参数,而如果n = 3释放了两者(注意在函数中释放它们的位置(。

if (rem)

即使您释放它也可能返回true,因为您之后没有显式执行rem = NULL(您还调用printf在释放rem之后打印rem

最后一个问题是,您无法在任何地方释放buff。您应该在退出get_next_line之前将其释放。

最新更新