Где освободить (бесплатно)

Изучая учебник по связанным спискам на 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 ответа

Решение

Вам нужно создать функцию для освобождения вашего списка.

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

Вы можете назвать это в основном в конце.

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

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

Вы должны освободить после завершения использования того, что выделено. Следуйте списку и освободите.

Например, вы можете вызвать эту функцию 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,

Другие вопросы по тегам