Функция AddToTail в двусвязном списке вызывает дамп ядра - PullRequest
0 голосов
/ 01 апреля 2019

В настоящее время я пытаюсь написать двусвязный класс списка на языке c ++ для cygwin64.Моя функция addToTail (чтобы добавить узел в конец списка) вызывает дамп ядра.Я определил строку кода, которая делает это, но не может понять, почему.

Я очистил свой код до самой простой формы, чтобы решить, где проблема.Я определил его как строку current->setNext(temp);.

ниже приведен весь соответствующий код

class Node
{
    private: 
    classType data;
    Node* next;
    Node* previous;

    public:
    void Node::setData(const valueType& newData)
    {
        data = newData;
    }

    void Node::setNext(Node* newNext)
    {
        next = newNext;
    }

    void Node::setPrevious(Node* newPrevious)
    {
        previous = newPrevious;
    }
};
class LinkedList
{
    private:
    Node* tail;
    Node* head;
    Node* current;

    public:
    void LinkedList::addToTail(const classType& newTail)
    {
        Node* temp = new Node;
        temp->setData(newTail);
        current = tail;
        temp->setPrevious(current);
        current->setNext(temp);
        tail = temp;
        delete temp;
    }
};

Ожидаемые результаты функции - добавить новый узел в конецсписок.Что происходит, это вызывает дамп ядра.

1 Ответ

1 голос
/ 01 апреля 2019

(я предполагаю, что LinkedList имеет действительные конструкторы, а операторы присваивания не показаны в вопросе. Если в них нет таковых, то addToTail наступает на неопределенное поведение с самого начала)

public:
void LinkedList::addToTail(const classType& newTail)
{
    Node* temp = new Node;
    temp->setData(newTail);
    ...
    tail = temp;
    delete temp;
}

Последнее удаление не имеет смысла. Он удаляет temp, что аналогично удалению tail, поскольку tail по-прежнему доступен из LinkedList. Это вызовет неопределенное поведение при следующем вызове addToTail, так как он получит доступ к удаленному хвосту здесь:

    temp->setData(newTail);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...