我有一个类型为ordi
的ordinateur
typedef struct ordi
{
int numeroOrdi;
char *nomOrdi;
int CapaciteDisque;
lst_logi LogicielsInstalles;
} ordi;
这个ordinateur
有一个类型为lst_logi
的双链表LogicielsInstalles
typedef struct lst_logi
{
log *logiciel;
struct lst_logi *next;
struct lst_logi *prev;
} lst_logi;
我做了一个函数FormaterOrdinateur
来删除所有的"Logiciels"(法语软件)
换句话说,释放链表LogicielsInstalles
。
void FormaterOridinateur(ordi *ordinateur)
{
lst_logi *head = &ordinateur->LogicielsInstalles;
lst_logi *tmp;
// printf("curr: %sn", head->logiciel->designation);
// printf("curr->next: %sn", (head->next)->logiciel->designation);
// these two line to make sure the node and node->next exit
while (head)
{
tmp = head;
head = head->next;
free(tmp);
}
ordinateur = NULL;
}
,但这个函数给了我seg故障
更多的细节与gdb:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7e244c9 in arena_for_chunk (ptr=0x7fffffffe051) at ./malloc/arena.c:156
156 ./malloc/arena.c: No such file or directory.
当我搜索arena_for_chunk
错误时,我发现这意味着内存不存在或不能被释放
我确信我试图释放的节点存在,所以它只是拒绝被释放。
对此有什么解释吗?我该怎么补救呢?
提前感谢;)
在struct ordi
中,LogicielsInstalles
应该是一个指针,而不是一个结构,以说明没有安装软件的计算机,并避免在&ordinateur->LogicielsInstalles
上出现无效的free
。
此外,函数FormaterOrdinateur
在释放列表后不会重置指针LogicielsInstalles
。它会设置ordinateur = NULL
,因为ordinateur
只是一个局部参数值,没有任何作用。
这可能会导致以后的无效访问或双free。
修改后的版本:
typedef struct lst_logi {
log *logiciel;
struct lst_logi *next;
struct lst_logi *prev;
} lst_logi;
typedef struct ordi {
int numeroOrdi;
char *nomOrdi;
int CapaciteDisque;
lst_logi *LogicielsInstalles;
} ordi;
void FormaterOrdinateur(ordi *ordinateur) {
lst_logi *node = ordinateur->LogicielsInstalles;
while (node) {
lst_logi *next = node->next;
// free the log structure pointed to by node->logiciel
free(node->logiciel);
// free the node structure
free(node);
node = next;
}
ordinateur->LogicielsInstalles = NULL;
}