Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 释放链接列表中的数据_C_List_Memory_Struct_Free - Fatal编程技术网

C 释放链接列表中的数据

C 释放链接列表中的数据,c,list,memory,struct,free,C,List,Memory,Struct,Free,嘿,我目前正在处理一个任务,我需要删除列表中的特定节点。我还需要释放这些节点的内存。 这是给定的结构: typedef结构列表 { 结构s_列表*下一步; 作废*数据; }t_列表; 我需要创建的函数传递了一个函数,该函数释放节点的数据 void remove_节点(t_list**begin_list,void(*free_fct)(void*)) //free_fct是释放数据的函数。 所以我的问题是:为什么我们不能像这样释放节点呢 s\u列表*节点=*开始列表) 自由(节点) 为什么

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

typedef结构列表
{
结构s_列表*下一步;
作废*数据;
}t_列表;
我需要创建的函数传递了一个函数,该函数释放节点的数据

void remove_节点(t_list**begin_list,void(*free_fct)(void*))
//free_fct是释放数据的函数。
所以我的问题是:为什么我们不能像这样释放节点呢

s\u列表*节点=*开始列表)
自由(节点)
为什么任务提供了专门释放数据的功能? 我的猜测是,如果我只释放节点,数据仍将存储在内存中,但这不意味着下一步也需要释放吗


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

关键是要使列表更通用。如果在remove_node函数中释放
数据
指针,则基本上只能在数据指针中存储指向malloc、calloc和realloc分配的内存的指针。 此外,考虑节点<代码>数据>代码>指向以下结构实例:

struct some_struct{
    FILE *file;
    int *intArray;
}
该结构可能已使用
malloc
动态分配,因此您可以使用
free
释放它。但是
file
可能包含有效的文件句柄,
intArray
可能是指向动态分配的int数组的指针。在这种情况下,只要释放
数据
,就会产生一个ressource泄漏。 但是,如果列表实现允许传递“析构函数”,则可以传递如下函数:

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

在不知道如何分配内存的情况下很难说(可能会显示为分配内存而使用的函数)。但是您不应该释放数据和注释吗(这是基于您为数据分配A,为节点分配B的假设)?