Нужен ли мне деструктор для класса lstack, даже если все элементы были выскочены? Пожалуйста, помогите мне с этим.
~lstack()
{
if(top==NULL)
return;
node *tmp;
while(top!=NULL)
{
tmp=top;
top=top->link;
delete tmp;
}
}
int main()
{
lstack s;
s.push(11);
s.push(101);
s.push(99);
s.push(78);
cout<<"Item Popped = "<<s.pop()<<endl;
cout<<"Item Popped = "<<s.pop()<<endl;
cout<<"Item Popped = "<<s.pop()<<endl;
cout<<"Item Popped = "<<s.pop()<<endl;
getch();
return 0;
}
Если вы пишете класс, а класс управляет такими ресурсами, как память в свободном хранилище, вы должны включить деструктор. Таким образом, пользователям вашего класса, независимо от того, будут ли другие программисты или вы сами в будущем, не нужно помнить о том, чтобы всплывать все элементы стека в качестве предпосылки для отсутствия утечки памяти. Ваше использование "delete" предполагает, что вам нужен деструктор.
Пользователи, конечно же, не ожидали такого требования.
Даже если вы//сделали/пытались навязать такое правило через документацию, и добросовестный программист попытался следовать ему, возможность исключений (которые обрабатываются вне нормального потока управления) означала бы, что иногда пользователь не мог пустой стек, даже если он этого захочет.
Деструктор должен быть написан так, чтобы он обрабатывал случай пустого стека (как вам кажется).
Все классы, которые могут быть построены в стеке, нуждаются в деструкторе. Если вы не объявите один, будет создан деструктор, который просто уничтожит всех членов объекта (очевидно, уничтожая встроенные типы ничего не делает).
Для класса, выделяющего любой ресурс, вы всегда хотите деструктор: если что-то пойдет не так, и вы получите исключение, вы в противном случае пропустили бы память. Кроме того, неудобный интерфейс требует, чтобы содержимое объекта было удалено, прежде чем его можно было безопасно уничтожить.
Наконец, не то, что стандартная библиотека C++ имеет шаблон класса стека: std::stack<T>
.
Реализация деструктора, который вы разместили, не является сложной! Это можно упростить:
lstack::~lstack()
{
while(top!=NULL)
{
std::unique_ptr<node> tmp(top);
top=top->link;
}
}