变量 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.

之前释放它