所以我正在编写一个函数,它从文件中提取一行并打印出来,问题是我无法释放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检查内存块,谢谢。
我只想解决程序中的泄漏问题:第一个在这一行:
于ft_strjoin的返回值是*line = ft_strjoin(*line ,buff);
*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
之前将其释放。