【问题标题】:variable char* wont free up?变量 char* 不会释放?
【发布时间】: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 变量的用途是什么?除了造成内存泄漏之外,它似乎没有任何用处。

标签: c malloc free


【解决方案1】:

我只会解决您程序中的漏洞: 第一个在这一行:

*line = ft_strjoin(*line ,buff);

发生的情况是,由于您的 ft_strjoin 的返回值是 *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)

即使您释放它也可能返回 true,因为您之后没有明确地执行 rem = NULL(您还调用 printf 在您的免费 rem 之后打印 rem

最后一个问题是你没有在任何地方释放buff。您应该在退出 get_next_line 之前释放它。

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2021-05-31
    • 2012-05-07
    • 2023-03-14
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多