我在循环列表中“清除”节点的算法遇到了一些问题:大多数情况下程序崩溃,有时不会崩溃。我很确定算法没问题,我对解决方案一无所知......: - (
这里有一些代码:
clear()
函数(注意:mFreenode
是循环列表的“无尾”节点):
List* clear() {
if (mFreenode->getNext() != 0) {
Node<T>* current = mFreenode->getNext();
Node<T>* temp = 0;
while (current != mFreenode) {
temp = current->getNext();
delete current;
current = temp;
}
}
mFreenode->setNext(0);
mFreenode->setPrev(0);
mSize = 0;
return this;
}
这是Node
析构函数:
~Node() {
delete &item;
}
有什么建议吗?
答案 0 :(得分:0)
你的析构函数看起来很可疑 - 我假设item
是Node
的成员变量。如果item
是值类型(例如int
或std::string
),那么您根本不应删除它。如果它是一个指针,那么也许你应该做delete item;
- 但前提是节点拥有它有指针的项目的所有权。
答案 1 :(得分:0)
当您delete item;
时,在删除节点后,不要让前一个节点指向节点。因此,您删除的节点之前的节点指向无处。
答案 2 :(得分:0)
请不要对循环链接列表执行以下操作:
while (current != mFreenode) {
temp = current->getNext();
delete current;
current = temp;
}
您为什么认为这是一个循环链表?因为尾节点指向第一个,所以当您这样做时,循环将继续进行,并删除除当前节点之前的所有节点。 然后尝试访问它是一个坏主意:
mFreenode->setNext(0);
mFreenode->setPrev(0);