Рекурсия, вызывающая сбой программы, но та же концепция в цикле while не из деструкторов C ++ - PullRequest
2 голосов
/ 09 октября 2019

Я создаю класс связанного списка, и удаление связанного списка приводило к сбою моей программы, но я не могу понять, почему, хотя я отследил его построчно в режиме отладки.

В методе 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++;
}

1 Ответ

0 голосов
/ 09 октября 2019

Программа правильная и не плохо сформирована.

Проблема связана с ограничением памяти.

Один «обходной путь» - ручная обработка памяти с помощью итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...