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

Crash when deleting nodes in a circular list

本文关键字:节点 崩溃 循环 列表 删除      更新时间:2023-10-16

我在循环列表中"清除"节点的算法中遇到了一些问题:大多数时候程序会崩溃,有时不会。我很确定算法是好的,我不知道解决方案……: - (

下面是一些代码:

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

任何建议吗?

你的析构函数看起来很可疑——我假设itemNode的成员变量。如果item是一个值类型(例如intstd::string),那么你根本不应该删除它。如果它是一个指针,那么也许你应该做delete item;——但只有当节点拥有它有指针指向的项的所有权时。

当您执行delete item;时,您不会使前一个节点指向您删除的节点之后的节点。因此,在您删除的节点之前的节点不指向任何地方。

对于循环链表,请不要这样做:

while (current != mFreenode) {
            temp = current->getNext();
            delete current;
            current = temp;
        }

为什么你认为它是一个循环链表??因为尾节点指向第一个节点,所以当您这样做时,循环将继续并删除除当前节点之前的节点之外的所有节点。然后你尝试访问它坏主意:

mFreenode->setNext(0);
    mFreenode->setPrev(0);