删除循环列表中的节点时崩溃

时间:2013-05-10 17:03:29

标签: c++ memory-management nodes clear circular-list

我在循环列表中“清除”节点的算法遇到了一些问题:大多数情况下程序崩溃,有时不会崩溃。我很确定算法没问题,我对解决方案一无所知......: - (

这里有一些代码:

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;
}

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

你的析构函数看起来很可疑 - 我假设itemNode的成员变量。如果item是值类型(例如intstd::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);
相关问题