繁体   English   中英

释放链表中的数据

[英]Freeing data in a linked list

嘿,我目前正在处理需要删除列表中特定节点的任务。 我还需要释放这些节点的 memory。 这是给定的结构:

typedef struct      s_list
{
    struct s_list   *next;
    void            *data;    
}                   t_list;

我需要创建的 function 传递了一个 function,它释放了节点的数据。

void remove_node(t_list **begin_list, void (*free_fct)(void *))
//free_fct being the function to free data.

所以我的问题是:为什么我们不能像这样释放节点?:

s_list *node = *begin_list)
free(node)

为什么任务提供一个function专门免费数据? 我的猜测是,如果我只释放节点,数据仍将存储在 Memory 中,但这是否意味着 next 也需要被释放?

我也不知道 free_fct function 会是什么样子。 如果数据是字符串,free_fct function 会是什么样子?

关键是使列表更通用。 如果你只是释放你的remove_node function中的data指针,你基本上只能在数据指针中存储由malloc、calloc和realloc分配的指向memory的指针此外,考虑节点的data字段指向以下结构的实例:

struct some_struct{
    FILE *file;
    int *intArray;
}

该结构可能已使用malloc动态分配,因此您可以使用free释放它。 但是file可能包含一个有效的文件句柄,而intArray可能是一个指向动态分配的 int 数组的指针。 在这种情况下,通过释放data ,您将创建资源泄漏。 但是,如果您的列表实现允许您传递“析构函数”function,则可以传递 function,例如:

void SomeStructDestructor(void* data){
    struct some_struct *temp = (struct some_struct*)data;
    close(temp->file);
    free(temp->intArray);
    free(data);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM