-2

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

这里有一些代码:

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

有什么建议吗?

4

3 回答 3

0

当您delete item;不使前一个节点指向您删除的节点之后的节点时。结果,您删除的节点之前的节点指向无处。

于 2013-05-10T18:22:04.733 回答
0

你的析构函数看起来很可疑——我假设它itemNode. 如果item是值类型(例如intor std::string),那么您根本不应该删除它。如果它是一个指针,那么也许你应该这样做delete item;——但前提是节点拥有它所指向的项目的所有权。

于 2013-05-10T17:36:16.710 回答
0

请不要对循环链表执行以下操作:

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

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

mFreenode->setNext(0);
    mFreenode->setPrev(0);
于 2020-06-25T04:19:09.100 回答