Можно ли создать нерекурсивный деструктор в стеке, как контейнер?

Я пишу код на C++ с контейнером, похожим на стек.

class Stack {
public:
    int data;
    Stack *next;
    void push();
    void pop();
    ~Stack() {
        delete next;
    }

};

Проблема в рекурсивном деструкторе. Если я добавляю сотни тысяч элементов, деструктор вылетает в стек. Можно ли изменить это нерекурсивным способом?

2 ответа

Решение

Вы изначально создали "рекурсивный" класс. Хотя было бы лучше перепроектировать ваш класс и включить внутреннюю закрытую структуру, названную, например, Node neverthelsee, этот код поможет вам избежать рекурсивных вызовов деструкторов для вашего исходного класса.

~Stack() 
{
    Stack *next = this->next;
    while ( next )
    {
       Stack *current = next;
       next = next->next;
       current->next = nullptr;
       delete current;
    }
}

Естественное решение - иметь внутренний Node структура, которая содержит фактические данные и связь. Тогда Stack У класса просто есть указатель на первый узел в списке, и он может легко перебрать список, чтобы удалить каждый узел.

Другие вопросы по тегам