Вы должны редко (если вообще когда-либо) использовать delete this;
. Вы также не очищаете указатель next
, поэтому он становится висящим указателем. Эта память, вероятно, все еще содержит большую часть данных, которые были там, поэтому, когда вы просматриваете список после «очистки», вы видите старые данные - но учтите, что это только один из многих вещи, которые могут произойти, потому что доступ к разрушенному объекту - неопределенное поведение.
Вместо этого рассмотрите возможность сделать это:
void Node::clear() {
cout << "Clear: " << this << ":" << value << endl;
if(next != NULL){
next -> clear();
delete next;
next = NULL;
}
}
Еще лучше, сделайте это в деструкторе Node, и затем вы можно просто удалить целевой узел:
void Node::~Node() {
clear();
}
void Node::clear() {
cout << "Clear: " << this << ":" << value << endl;
if(next != NULL){
delete next;
next = NULL;
}
}
Еще лучше, сделать next
a std::unique_ptr
, а затем вы можете просто сбросить его на clear()
, уничтожение происходит автоматически c и копирование Узла должным образом запрещено:
class Node {
private:
std::unique_ptr<Node> next;
double value;
public:
void clear();
};
void Node::clear() {
cout << "Clear: " << this << ":" << value << endl;
next.reset(null);
}
Обратите внимание, что последний узел (глава) не может удалить себя. Как уже отмечали другие, очистка узла не может разумно ничего сделать, кроме как прекратить указывать на следующий узел. Вам нужно иметь отдельный класс для списка и очистить его.