【发布时间】:2019-11-05 14:54:39
【问题描述】:
所以我正在编写一个从文件中获取一行并打印它的函数,问题是我无法释放 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("%s\n", 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---%s\n", rem);
free(rem);
printf("---2ND---%s\n", rem);
}
else
*line = ft_strdup("");
while (bol && (bwr = read(fd, buff, BUFFER_SIZE)))
{
buff[bwr] = '\0';
if ((ptr = ft_strchr(buff, '\n')))
{
rem = ft_strdup(ptr + 1);
*ptr = '\0';
bol = 0;
}
*line = ft_strjoin(*line ,buff);
}
return(0);
}
所以我不知道为什么它不会释放 行
PS:我正在使用 lldb 检查内存块,谢谢。
【问题讨论】:
-
建议:将编译器警告打开到最大。注意他们。
-
显示
get_next_line的代码 -
我编辑了帖子
-
仅仅因为你调用了
free,内存中的内容不会被魔法般地从物理单元中擦除。free也不会改变指针rem的地址。所以它仍然指向与以前相同的区域,尽管访问该区域不再安全。在程序的其他部分决定使用此内存来存储其他内容之前,旧数据将保留在那里。 -
rem变量的用途是什么?除了造成内存泄漏之外,它似乎没有任何用处。