使用额外的解除分配数据销毁c中的链表

时间:2013-10-30 08:45:52

标签: c linked-list

我在C中有一个链接列表,我需要通过请求销毁并保留内存分配

这是代码:

有人可以向我解释我需要使用参数dealloc添加什么?

    /** Destroy and de-allocate the memory hold by a list
\param list - a pointer to an existing list
\param dealloc flag that indicates whether stored data should also be de-allocated      
    */
    void dbllist_destroy(dbllist_t *list,dbllist_destroy_t dealloc)
    {
    dbllist_node_t *current = (dbllist_node_t *)malloc(sizeof(dbllist_node_t));
    dbllist_node_t *current = (dbllist_node_t *)malloc(sizeof(dbllist_node_t));

        if(current == NULL || temp == NULL)
            return -1;
        current = dbllist_tail(list);
        while (current != NULL)
        {
            temp = dbllist_prev(current);
            free(current);
            current = temp;
            dbllist_size(list)--;
        }
        free(current);
        free(temp);
        free(list);
        return 0;
    } 

    typedef enum { DBLLIST_LEAVE_DATA = 0, DBLLIST_FREE_DATA } dbllist_destroy_t;

1 个答案:

答案 0 :(得分:0)

所以,我可以看到剩下的问题:

  1. 顶部的双重malloc - 所有这些都将是废物记忆。这里没有必要分配任何东西。
  2. dbllist_size(list)--毫无意义。你只是得到一个价值,然后减少它。大概你正试图减少列表的存储大小。 dbllist_size返回指向大小的指针(不太可能,但在这种情况下,您需要执行(*dbllist_size(list))--))。您更有可能需要调用dbllist_set_size(如果有)或(最有可能)直接更改大小值(list->size--或类似的东西)。但是,由于您要释放整个结构,您可以在结尾处将大小设置为0 ^ 1
  3. 您想要取消分配数据的点就在中间的free(current)之前。可能它会像if (DBLLIST_FREE_DATA==dealloc) { free(dbllist_get_data(current));}(再次,取决于api)
  4. 不需要 for循环后的free(current) ,因为此时当前必须为空。
  5. 在顶部检查null是好的,但是你检查错误的东西。您应该检查list是否为空。
  6. 您尚未声明temp
  7. [^ 1]:如果你需要破坏线程安全,那么可能想要在释放每个项目后设置大小;在这种情况下,您还需要在for循环内部放置一个互斥锁。此外,由于这可能是双链表,您还需要更新上一个/下一个指针。可能这对你来说太过分了。