Я создаю класс связанного списка, и удаление связанного списка приводило к сбою моей программы, но я не могу понять, почему, хотя я отследил его построчно в режиме отладки.
В методе main я создаю список и создаю значения:
List list = List(new Node(rand()));
while (list.size < 10000)
{
list.add(rand());
}
Список принимает указатель Node и присваивает указатель узла Node, называемый head. Узел также имеет другую переменную-член, которая является целым числом с именем size.
Затем в конце метода вызывается деструктор для списка:
~List()
{
delete head;
}
, и этот деструктор вызывает деструктор. для головного узла:
~Node()
{
delete next;
}
У каждого узла есть указатель узла, называемый следующим, который указывает либо на следующий узел в списке, либо на nullptr, если это конец, который завершает вызовы удаления.
Что меня больше всего смущает, так это то, что это работает для всех значений до 2000, однако в какой-то момент 2000-х это вызывает сбой программы.
Когда я оставил деструктор Node пустым и изменилДеструктор списка:
~List()
{
while (head)
{
Node* temp = head->next;
std::cout << head->value << std::endl;
delete head;
head = temp;
}
size = 0;
}
Программа работала и избавлялась от всех узлов в связанном списке. Насколько я могу судить, я применяю тот же принцип для рекурсивного вызова, поэтому я не знаю, что вызывает сбой.
Структура узла:
int value;
Node* next;
Node(int val, Node* node = nullptr)
{
value = val;
next = node;
}
~Node()
{
//delete next;
}
Структура списка:
Node* head;
int size;
List(Node* val)
{
head = val;
size = 1;
}
~List()
{
//delete head;
while (head)
{
Node* temp = head->next;
std::cout << head->value << std::endl;
delete head;
head = temp;
}
size = 0;
}
void add(int value)
{
head = new Node(value, head);
size++;
}