在哪里解除分配(免费)

时间:2016-06-02 13:18:31

标签: c valgrind

在C中学习关于链表的教程。我已经编译了这段代码并通过valgrind运行它。它显示了4个分配和0个释放,我理解。我需要知道如何正确地调用free()来解除分配。

代码示例:llist2.c

// linked list: inserting at the n'th position
#include "stdio.h"
#include "stdlib.h"

typedef struct Node
{
    int data;
    struct Node* next;
} Node;

Node* head;

void Insert(int data, int n)
{
    Node* temp1 = malloc(sizeof(Node));
    temp1->data = data;
    temp1->next = NULL;

    if(n==1) { // list is empty, set next to head, initially NULL.
        temp1->next = head;
        head = temp1;
        return;
    }

    Node* temp2 = head;
    for(int i = 0; i < n-2; i+=1) {
        temp2 = temp2->next;
    }

    temp1->next = temp2->next;
    temp2->next = temp1;
}

void Print() {
    Node* temp = head;
    while(temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }

    printf("\n");
}

int main (int argc, char *argv[])
{
    head = NULL;
    Insert(2,1);
    Insert(3,2);
    Insert(4,1);
    Insert(5,2);
    Print();

    return 0;
}   

2 个答案:

答案 0 :(得分:2)

完成使用已分配的内容后,您应该取消分配。按照列表并取消分配。

例如,您可以在调用Deallocate()后调用此函数Print()

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

请注意,你不能这样做

void Deallocate_bad() {
    Node* temp = head;
    while(temp != NULL) {
        free(temp);
        temp = temp->next; /* undefined behavior */
    }
    head = NULL;
}

因为您在取消分配temp->next后无法访问temp

答案 1 :(得分:2)

您需要创建一个功能来释放您的列表。

void freelist(Node* head)
{
    Node *next,*curr;
    curr = head;
    while (curr != NULL)
    {
       next = curr -> next;
       free(curr);
       curr = next;
    }
}

你最后可以在main中调用它。

int main (int argc, char *argv[])
{
    // Other code

    freelist(head);
    head = NULL;
    return 0;
}