2016-08-13 109 views
-1

我试图释放这些链表,但我没有收到编译错误,但valgrind说“30个分配,14个释放,6,377字节分配”。 不应该用这个函数擦除列表中的所有分配。在c中免费链接列表

void free_mem(struct medico *head_m, struct paciente *head_p , struct consulta *head_c) 
{ 
    struct medico *tmp_m = NULL; 
    struct paciente *tmp_p = NULL; 
    struct consulta *tmp_c = NULL; 

    while (!head_m) { 
     tmp_m = head_m->next; 
     free(head_m); 
     head_m = tmp_m; 
    } 

    while (!head_p) { 
     tmp_p = head_p->next; 
     free(head_p); 
     head_p = tmp_p; 
    } 

    while (!head_c) { 
     tmp_c = head_c->next; 
     free(head_c); 
     head_c = tmp_c; 
    } 
} 
+1

请构造一个[最小测试用例](http://stackoverflow.com/help/mcve)。 –

+0

一旦你重写'while()'循环到'for(;;)'循环中,你会看到你做错了什么。 – wildplasser

回答

1

你的循环条件是错误的:

while (!head_m) 

如果head_m不为空,永远不会执行循环。修复,删除!

while (head_m) 
+0

谢谢!这确实是一个小菜鸟的错误 - 而且很容易发现一切正在被释放。 – m3k3r1