Необычная ошибка сегментации - PullRequest
0 голосов
/ 10 октября 2019

Я пытался удалить альтернативные узлы в списке ссылок. Я заметил странное поведение.

void delete_alternate_node_LinkedList(Node *head) {
    Node *prev = head;
    Node *curr = head->next;
    while (prev != NULL and curr != NULL) {
        prev->next = curr->next;
        free(curr);
        prev = prev->next;
        if (prev != NULL) {
            curr = prev->next;
        }
    }
}

Этот код работает нормально, за исключением того, что голова nullptr, когда я использую free, чтобы деликатно или намеренно сохранить утечку памяти, но если я изменяю строку free(curr) с delete curr, я получаюошибка сегментации.

Может кто-нибудь объяснить мне причину?

Вот эталонные коды

class Node {
public:
    int data;
    Node * next;
    Node(int data){
        this -> data = data;
        this -> next = NULL;
    }

    ~Node() {
        if(next) {
            delete next;
        }
    }
};
Node* takeinput() {
    int data;
    cin >> data;
    Node *head = NULL, *tail = NULL;
    while(data != -1){
        Node *newNode = new Node(data);
        if(head == NULL) {
            head = newNode;
            tail = newNode;
        }
        else{
            tail -> next = newNode;
            tail = newNode;
        }
        cin >> data;
    }
    return head;
}

void print(Node *head) {
    Node *temp = head;
    while(temp != NULL) {
        cout << temp -> data << " ";
        temp = temp -> next;
    }
    cout << endl;
}

1 Ответ

3 голосов
/ 10 октября 2019

У вашего деструктора есть проблема. Допустим, A->B->C->D->nullptr Теперь, когда вы удаляете B, он вызывает деструктор (если вы используете free, он не будет). он будет рекурсивно удалять C (который, в свою очередь, удаляет D) и ..... до конца, поэтому на следующей итерации вы держитесь за висячий указатель (C) и получаете ошибку сегмента, когда пытаетесь ее разыменовать.

...