У меня возникли некоторые проблемы с алгоритмом «очистки» узлов в круговом списке: в большинстве случаев происходит сбой программы, а иногда нет. Я совершенно уверен, что алгоритм в порядке, и я понятия не имею о решении … 🙁
Вот несколько кусочков кода:
clear()
функция (Примечание: mFreenode
является узлом «head-tail free» для кругового списка):
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;
}
Любое предложение?
Ваш деструктор выглядит очень подозрительно — я предполагаю, что item
является переменной-членом Node
, Если item
это тип значения (например, int
или же std::string
), тогда вы не должны удалять его вообще. Если это указатель, то, возможно, вы должны делать delete item;
— но только если узел имеет право собственности на элемент, на который он имеет указатель.
Когда ты delete item;
вы не заставляете прежний узел указывать на узел после удаляемого вами узла. В результате узел Previus к тому, который вы удаляете, указывает на никуда.