【问题标题】:AddToTail function in doubly linked list causes core dump双向链表中的 AddToTail 函数导致核心转储
【发布时间】:2019-04-01 07:28:20
【问题描述】:

我目前正在尝试在 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】:

    (我假设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);
    

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多