释放链表中的数据
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);
}
嘿,我目前正在执行一项任务,我需要删除列表中的特定节点。我还需要释放这些节点的内存。 这是给定的结构:
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);
}