C 我的函数get_next_行的内存泄漏
我试着学习C语言。 我成功地创建了一个程序,它逐行读取数据并将其返回到终端。不幸的是,当我检查valgrind时,我仍然有一些泄漏问题。你有什么建议吗C 我的函数get_next_行的内存泄漏,c,C,我试着学习C语言。 我成功地创建了一个程序,它逐行读取数据并将其返回到终端。不幸的是,当我检查valgrind时,我仍然有一些泄漏问题。你有什么建议吗 #include "get_next_line.h" #include "./libft/libft.h" int ft_check_error(char **line, char **stock, int fd) { if (line == NULL || fd < 0 || BUFF_SIZE < 1)
#include "get_next_line.h"
#include "./libft/libft.h"
int ft_check_error(char **line, char **stock, int fd)
{
if (line == NULL || fd < 0 || BUFF_SIZE < 1)
return (-1);
if (!*stock)
{
if (!(*stock = ft_strnew(BUFF_SIZE + 1)))
return (-1);
}
return (0);
}
char *ft_read(char *stock, char *buf)
{
char *tmp;
tmp = stock;
stock = ft_strjoin(stock, buf);
ft_strdel(&tmp);
return (stock);
}
int get_next_line(const int fd, char **line)
{
static char *stock[1024];
char buf[BUFF_SIZE + 1];
int ret;
int i;
if (ft_check_error(line, &stock[fd], fd) == -1)
return (-1);
while ((ret = read(fd, buf, BUFF_SIZE)) > 0)
{
buf[ret] = '\0';
stock[fd] = ft_read(stock[fd], buf);
}
i = 0;
if (stock[fd][i])
{
while (stock[fd][i] != '\n' && stock[fd][i])
i++;
*line = ft_strsub(stock[fd], 0, i);
free(*line);
stock[fd] = &stock[fd][i + 1];
return (1);
}
if (ret == -1)
return (-1);
return (0);
}
如果需要传入双指针,则首先需要声明一个
char *ptr
char **line
ptr = malloc(sizeof(?how much memory?))
line = &ptr
指针变量的指针可以保存另一个指针变量的地址
然后在函数中使用双指针,也可以在函数中使用free
free(line)
关于双指针是如何工作的,请参阅以获得一个非常好的答案
或者
您可以在函数中分配内存,这将使您的更改量最小
在main中
char **line;
然后,
请提供完整的代码示例,您缺少主要部分。也许可以提供Valgrind报告中的一个片段。。。。使用
gcc-g
编译您的程序,这样Valgrind就可以打印更多的脱胶信息<代码>行是传递到函数中的双指针,这意味着您将使用类似于free(line[i])
的内容释放每一行,然后再使用free(line)
释放顶级指针。在纪念碑上,你将行的值
传递到free()
我在我的帖子中添加了主要部分。我不确定是否有空闲行[I],因为我在返回它之前释放了每一行。我们无法知道“/libft/libft.h”中有什么内容
所以内存是如何处理的还不清楚。只有一个buff大小为20,但我们可以根据需要进行更改。对于培训,有必要使用char**line,我不能在main中释放它,因为我的工作只是让get next line正确释放。但是char*stock[fd]它已经是一个指针否?因为程序运行得很好,我只有一些内存loss@Brugher您还没有提供任何关于“lft_strsub(stock[fd],0,i);”的信息现在是,现在是,甚至回来了。我已经用另一种方式更新了我的答案。SUB允许内存用于将我的库存放入已读取的行中,或直到“\n”为止。所以我已经为此分配了内存。@Brugher请查看我的alt答案
char **line;
int get_next_line(const int fd, char **line) {
*line = malloc(sizeof(?how much memory?));
free(*line)