нужен деструктор, чтобы освободить место в памяти, даже если все элементы были вытолкнуты

0

Нужен ли мне деструктор для класса 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;
    }
  • 3
    Что, если они не все лопнули?
  • 0
    Конечно нам нужно, если они не лопнут. Но я хотел убедиться, что это обязательно или нет, хотя все пункты были выскочил
Показать ещё 6 комментариев
Теги:
stack

2 ответа

3

Если вы пишете класс, а класс управляет такими ресурсами, как память в свободном хранилище, вы должны включить деструктор. Таким образом, пользователям вашего класса, независимо от того, будут ли другие программисты или вы сами в будущем, не нужно помнить о том, чтобы всплывать все элементы стека в качестве предпосылки для отсутствия утечки памяти. Ваше использование "delete" предполагает, что вам нужен деструктор.

Пользователи, конечно же, не ожидали такого требования.

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

Деструктор должен быть написан так, чтобы он обрабатывал случай пустого стека (как вам кажется).

2

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

Для класса, выделяющего любой ресурс, вы всегда хотите деструктор: если что-то пойдет не так, и вы получите исключение, вы в противном случае пропустили бы память. Кроме того, неудобный интерфейс требует, чтобы содержимое объекта было удалено, прежде чем его можно было безопасно уничтожить.

Наконец, не то, что стандартная библиотека C++ имеет шаблон класса стека: std::stack<T>.

Реализация деструктора, который вы разместили, не является сложной! Это можно упростить:

lstack::~lstack()
{
    while(top!=NULL)
    {
        std::unique_ptr<node> tmp(top);
        top=top->link;
    }
}    
  • 0
    Почему "в стеке"?
  • 0
    @OliCharlesworth: объекты могут быть построены в куче, не будучи разрушаемыми. Очевидно, что если вы не можете их уничтожить, они протекут, но язык не предотвращает этого. С другой стороны, если вы попытаетесь создать объект в стеке, у которого нет доступного деструктора, компилятор откажется разрешить вам создать объект, потому что объект уничтожается при достижении конца блока.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню