释放链表中的数据

Freeing data in a linked list

嘿,我目前正在执行一项任务,我需要删除列表中的特定节点。我还需要释放这些节点的内存。 这是给定的结构:

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

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

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)

为什么任务提供了专门释放数据的功能? 我的猜测是,如果我只释放节点,数据仍会在存储的内存中,但这是否意味着 next 也需要被释放?

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

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

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

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

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