Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我的函数get_next_行的内存泄漏_C - Fatal编程技术网

C 我的函数get_next_行的内存泄漏

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)

我试着学习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)
        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)