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

标签 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. 顶部的双 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) ,因为此时 current 必须为 null。
  5. 在顶部检查 null 很好,但您检查的是错误的内容。您应该检查 list 是否为 null。
  6. 您尚未声明temp

[^1]:如果您需要 destroy 是线程安全的,那么您可能希望在释放每个项目后设置大小;在这种情况下,您还需要在 for 循环内部放置一个互斥体。另外,由于这可能是一个双链表,因此您还需要更新最后一个/下一个指针。但这对你来说可能有点过分了。

关于c - 用额外的释放数据销毁c中的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19677555/

相关文章:

C 链表查找函数

c - 嵌套结构,读取字符串 C 的字符时出错

c - 插入链表 -

正确关闭工作窃取线程池

c - 两个数的乘法

python - 无法导入用 C 编写的 Python 模块

c - 是否在 C 中定义了结构类型的对齐方式?

java - 用 Java 为我自己的 LinkedList 类编写自己的 peek() 方法

c - 什么是驱动程序?

c# - 如何从 LinkedList<T> 中提取 LinkedListNode<T>