用额外的释放数据销毁c中的链表

用额外的释放数据销毁c中的链表,c,linked-list,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

我有一个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;

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

  • 顶部的两个malloc-所有这些都会浪费内存。这里没有必要分配任何东西
  • dbllist\u大小(列表)
    没有意义。你只是得到一个值,然后减少它。可能您正在尝试减少列表的存储大小。无论是dbllist_size还是dbllist_size,都会返回一个指向该大小的指针(不太可能,但在这种情况下,您需要执行
    (*dbllist_size(list))--
    )。更可能的情况是,您需要调用
    dbllist\u set\u size
    (如果有)或(最有可能)直接更改大小值(
    list->size--
    或类似的内容)。但是,由于要取消分配整个结构,因此可以在^1末尾将大小设置为0
  • <> LI>在中间的“<代码>自由(当前)”之前,您将要对数据进行分立。如果(DBLLIST_FREE_DATA==dealloc){FREE(DBLLIST_get_DATA(current));}(同样,这取决于api),则可能类似于
    
    
  • 不需要for循环后的
    自由(当前)
    ,因为此时的电流必须为空
  • 在顶部检查null是好的,但您检查的是错误的。您应该检查
    list
    是否为空
  • 您尚未声明
    temp

  • [^1]:如果需要销毁以实现线程安全,则可能需要在释放每个项目后设置大小;在这种情况下,您还需要在for循环的内部放置一个互斥体。此外,由于这可能是一个双链接列表,因此您还需要更新最后/下一个指针。不过,这对您来说可能太过分了。

    至少在没有
    dbllist\u destroy\u t
    的定义的情况下是这样的,没有。好的,刚刚更新-从逻辑上讲,标志是真/假或0/1。天哪,你这么容易就按下了负声誉按钮。。。别紧张,朋友,我是新来的。。