我目前正在尝试在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;
}
};
该函数的预期结果是将一个新的Node添加到列表的末尾。这会导致核心转储。
答案 0 :(得分: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);