双链表中的AddToTail函数导致核心转储

问题描述 投票:0回答:1

我目前正在尝试在cygwin64上用c ++语言编写一个双向链表列表。我的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;
    }
};

该函数的预期结果是将新节点添加到列表的末尾。会发生什么是导致核心转储。

c++ doubly-linked-list coredump
1个回答
1
投票

(我假设LinkedList有有效的构造函数,并且问题中没有显示赋值运算符。如果它缺少那些,那么addToTail从一开始就处理未定义的行为)

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

最后一次删除毫无意义。它删除了temp,这与删除tail相同,因为仍然可以从LinkedList访问tail。它将在下次调用addToTail时触发未定义的行为,因为它将在此处访问已删除的尾部:

    temp->setData(newTail);
© www.soinside.com 2019 - 2024. All rights reserved.