C语言 列表节点未被释放,仍然消失



我的ls版本的另一个意外行为。

上下文:我为每个打开的目录生成一个输出列表,然后添加一个节点来显示接下来将显示哪个目录,就像原始 ls 一样。

为了处理-a选项,当没有为我的 ls 提供 -a 选项时,我只需删除所有以 "." 开头的节点。为了避免删除显示目录路径名的节点,我检查节点内容是否以 "./" 开头,也不以 ".:" 开头。

这是代码:

t_list          *ft_rem_hidden(t_list **output)
{
    t_list          *cursor;
    t_list          *tmp;
    cursor = *output;
    while (cursor)
    {
            tmp = cursor->next;
            if (ft_strnequ((char const *)cursor->content, ".:", 2) == 0
                    && ft_strnequ((char const *)cursor->content, ".", 1)
                    && ft_strnequ((char const *)cursor->content, "./", 2) == 0)
                            ft_lstfreeone(output, cursor);
            cursor = tmp;
    }
    return (*output);
}

现在有趣的部分。我在循环之前检查了(整个(列表,第一个节点的内容正如预期的那样".:"我检查了所述节点没有通过 if,并且正如预期的那样,它没有。我在while循环后检查了列表,aaaa,".:"不再存在。

这是ft_lstfreeone的代码,虽然我已经使用它一段时间没有问题,但我看不到任何其他罪魁祸首。好吧,除了我的无知。

void        ft_lstfreeone(t_list **alst, t_list *to_free)
{
    t_list      *cursor;
    t_list      *tmp;
    if (alst && *alst && to_free)
    {
        cursor = *alst;
        if (cursor == to_free)
        {
            *alst = cursor->next;
            ft_memdel((void **)&cursor->content);
            ft_memdel((void **)cursor);
        }
        else
        {
            while (cursor && cursor->next && cursor->next != to_free)
                cursor = cursor->next;
            if (cursor->next == to_free)
            {
                tmp = cursor->next;
                cursor->next = cursor->next->next;
                ft_memdel((void **)&cursor->content);
                ft_memdel((void **)tmp);
            }
        }
    }
}

我的节点在哪里?这几乎就是阻止我拥有功能性 ls 的全部原因,这相当令人愤怒。欢迎任何提示。

编辑:更多的测试表明,只有.:节点值得关注。如果我让我的 ls 显示任何其他目录的内容,它的名字在第一行显示得很好。

编辑 2:我创建了一个包含整个事情来源的 git 存储库,以防有人想仔细查看它。 https://github.com/pdecrat/ft_ls

您的代码存在多个问题 - 您实际上并没有删除节点本身,因为您没有传入指向节点的指针地址。

删除".:"的原因是ft_lstfreeone您需要ft_memdel tmp->content而不是cursor->content

按照编码,当您删除节点之后的节点时,您可能会删除".:"。

这也可能是为什么当你把 & 放在 tmp/cursor ft_memdel调用前面时 free(( 失败的原因。

正如@TonyLee评论所说,cursor可能指向一个释放的节点,使以下cursor成为废话。 为什么不在主代码中保存cursor->next if语句之前,并在if之后设置cursor,这样无论节点是否被释放,循环都可以安全进行,避免冒险?

相关内容

  • 没有找到相关文章

最新更新