Почему я продолжаю получать утечку памяти при запуске этой функции в моей программе на C?

#c #memory-leaks #linked-list

#c #утечки памяти #связанный список

Вопрос:

Итак, в основном я пишу код для LinkedList, но я продолжаю получать утечку памяти в результате этого кода здесь. Кто-нибудь может помочь мне найти причину, а также объяснить мне, что я делаю не так?

 struct Node* deleteNode(int data, struct Node* head){

    struct Node* current = head;
    struct Node* previous = NULL;

    if(head == NULL){
        return NULL;
    }
    while(current->data != data){
            if(current->next == NULL){
                return NULL;
            }else{
                previous = current;
                current = current->next;
            }
    }
    if(current == head){
        struct Node* temp = head;
        head = head->next;
        free(temp);
    }else
    {
        previous->next = current->next;
    }
    current = NULL;
    return head;
}
  

Ответ №1:

Вы никогда не вызываете free() удаленный узел списка, если он не является первым элементом вашего связанного списка.

Комментарии:

1. Извините, я довольно новичок во всем этом. Что вы имеете в виду? Если я удаляю узел, не следует ли мне освободить адрес этого узла?

2. @JorgeUrena Вам нужно вызывать free() узел даже в том случае, когда current != head . Аналогично тому, что вы сделали под if (current == head) блоком.

Ответ №2:

Вы получаете утечку памяти, потому что вы не вызываете free в случае, когда current != temp . Все, что вы делаете в else части, — это просто назначение previous->next = current->next без удаления текущего узла.

Вы уже нашли узел, который хотите удалить, используя свой while цикл, поэтому добавьте free(current) после previous->next = current->next .