免费链接列表

时间:2015-09-27 13:52:37

标签: c memory-leaks linked-list valgrind free

我在正确释放链接列表时遇到问题。我真的不知道如何以头脑和当前的方式做到这一点......

typedef struct list{
   int info;
   struct list *link;
} Node;

Node *_getnode (){
    return((Node *) malloc (sizeof (Node)));
}

int main() {

    Node *s = _getnode();
    s -> link = NULL;
    Node *t = s;
    int c;

    while (1) {
        printf("\n\t Enter number : ");
        scanf ("%d", &s -> info);   

        printf ("\n\t Continue? ");
        __fpurge (stdin);
        c = getchar ();

        if (c == 'N' || c == 'n'){
            s -> link = NULL;
            break;
        }

        s -> link = _getnode ();
        s = s -> link;
    }

    s = t;

    free(s);
    free(t);

    putchar('\n');
    return (0);
}

当我输入一个数字时,比valgrind说的那样,没有内存泄漏。但除此之外还有。我明白,我必须释放的不仅仅是第一个节点,但我不知道如何。

3 个答案:

答案 0 :(得分:2)

首先是行

free(s);
free(t);

是多余的,因为您已经在上一行中分配了s = t;

发生内存泄漏是因为您只在头指针上使用free,而不是链表中的所有节点。理想情况下,你应该遍历所有节点并释放分配给每个节点的内存,这是你的代码应该是这样的:

while(s != NULL)
{
     t = s->link;
     free(s);
     s = t;
}

答案 1 :(得分:1)

试试这个

void free_list(Node *head)
{
    Node *s;
    Node *n;
    if (head == NULL) /* passing `NULL' should be ok */
        return;
    for (s = head ; s != NULL ; s = n)
    {
        n = s->link;
        free(s);
    }
 }

您可以看到创建列表的方式存在明显缺陷。

答案 2 :(得分:1)

首先,请初始化节点,以便程序可以正确地告诉列表的结尾。

Node *_getnode (){
    Node* buffer = malloc (sizeof (Node));
    if (buffer == NULL) exit(1);
    buffer->info = 0; /* not important */
    buffer->link = NULL; /* this is important */
    return buffer;
}

然后,逐个释放节点。

void free_nodes (Node* head){
    while(head != NULL){
        Node* next = head->link;
        free(head);
        head = next;
    }
}

未经测试,将t传递给此free_nodes应该有效。