Можно ли создать нерекурсивный деструктор в стеке, как контейнер?
Я пишу код на 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
У класса просто есть указатель на первый узел в списке, и он может легко перебрать список, чтобы удалить каждый узел.