变量 char* 不会释放?
variable char* wont free up?
所以我正在编写一个从文件中获取一行并打印它的函数,问题是我无法释放 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] = '[=12=]';
if ((ptr = ft_strchr(buff, '\n')))
{
rem = ft_strdup(ptr + 1);
*ptr = '[=12=]';
bol = 0;
}
*line = ft_strjoin(*line ,buff);
}
return(0);
}
所以我不知道为什么它不会释放 行
PS:我正在使用 lldb 检查内存块,谢谢。
我只会解决你程序中的漏洞:
第一个在这一行:
*line = ft_strjoin(*line ,buff);
发生的情况是,由于 ft_strjoin 的 return 值为 *line
,*line
的旧内存地址] 过去指向的内容没有被释放就丢失了,现在 *line
指向另一个内存地址(保存 *line + buff
的地址)。
您有两种方法可以解决此问题:
第一个是做这样的事情:
char *to_free = *line;
*line = ft_strjoin(*line, buff);
free(to_free);
这将使 to_free 指向与 *line
在被调用 ft_strjoin
更改之前指向的相同内存地址。
另一种方法(我认为更好的方法)是实现 ft_strjoin
,它采用 3d 参数 int n
例如,如果 n = 1
你释放了 ft_strjoin
的第一个参数,如果 n = 2
你释放了第二个参数,如果 n = 3
你释放了两个参数(注意你在函数中释放它们的位置)。
if (rem)
可能 return 即使你释放它也是如此,因为你之后没有明确地做 rem = NULL
(你还调用 printf
打印 rem
你的免费 rem
.
最后一个问题是您没有在任何地方释放 buff
。您应该在退出 get_next_line
.
之前释放它
所以我正在编写一个从文件中获取一行并打印它的函数,问题是我无法释放 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] = '[=12=]';
if ((ptr = ft_strchr(buff, '\n')))
{
rem = ft_strdup(ptr + 1);
*ptr = '[=12=]';
bol = 0;
}
*line = ft_strjoin(*line ,buff);
}
return(0);
}
所以我不知道为什么它不会释放 行
PS:我正在使用 lldb 检查内存块,谢谢。
我只会解决你程序中的漏洞: 第一个在这一行:
*line = ft_strjoin(*line ,buff);
发生的情况是,由于 ft_strjoin 的 return 值为 *line
,*line
的旧内存地址] 过去指向的内容没有被释放就丢失了,现在 *line
指向另一个内存地址(保存 *line + buff
的地址)。
您有两种方法可以解决此问题:
第一个是做这样的事情:
char *to_free = *line;
*line = ft_strjoin(*line, buff);
free(to_free);
这将使 to_free 指向与 *line
在被调用 ft_strjoin
更改之前指向的相同内存地址。
另一种方法(我认为更好的方法)是实现 ft_strjoin
,它采用 3d 参数 int n
例如,如果 n = 1
你释放了 ft_strjoin
的第一个参数,如果 n = 2
你释放了第二个参数,如果 n = 3
你释放了两个参数(注意你在函数中释放它们的位置)。
if (rem)
可能 return 即使你释放它也是如此,因为你之后没有明确地做 rem = NULL
(你还调用 printf
打印 rem
你的免费 rem
.
最后一个问题是您没有在任何地方释放 buff
。您应该在退出 get_next_line
.