@ZelibobA1706

Как правильно очистить память при работе со стеком (ADT)?

Реализация стека через список. Пуш работает, но так понимаю происходит утечка памяти. И не могу понять как это исправить. Может кто подсказать?
template<typename T>
struct Node
{
    T data;
    Node<T>* next;
};

template <typename T>
class MyStack
{
private:
    Node<T> node;
    int max;
    int top;
public:
    MyStack(int maxSize = 100);

    inline T pop();
    inline bool push(T value);
};

template<typename T>
MyStack<T>::MyStack(int maxSize)
{
    max = maxSize;
    top = 0;
}

template<typename T>
inline T MyStack<T>::pop()
{
    if (top > 0)
    {
        T data = node.data;
        Node<T>* temp = node.next;
        //delete node;
        node = *temp;
        top--;
        return data;
    }
    return NULL;
}

template<typename T>
inline bool MyStack<T>::push(T value)
{
    if(top >= max) return false;
    Node<T>* tempNode = new Node<T>;
    *tempNode = node;
    node.data = value;
    node.next = tempNode;
    top++;
    return true;
}
  • Вопрос задан
  • 279 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А если комментарий //delete node; заменить на код, реально удаляющий ноду?
Ну и push() неправильно сделан. Хранить node надо как указатель Node<T>*, в конструкторе инициализировать NULL, в push:
tempNode->data = value;
tempNode->next = node;
node = tempNode;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Ariox41
Рекомендую почитать про std::unique_ptr
Вот вариант на c++11
#include <memory>

template<typename T>
class Stack{
public:
  Stack(std::size_t maxSize_): maxSize(maxSize_){}

  // Что происходит, когда стек пуст? Можно бросить исключение, или сделать как в std
  T pop(){
    // if (!tmp) throw ...
    auto tmp = std::move(head);
    // Обратите внимание, теперь head пуст
    head = std::move(tmp->next);
    // Теперь tmp->next пуст
    --size;
    return tmp->value;
  }

  bool push(T value){
    if (size+1 > maxSize)
      return false;

    // здесь может быть брошено исключение из-за нехватки памяти
    std::unique_ptr<Node> tmp(new Node(value));

    tmp->next = std::move(head);
    head = std::move(tmp);
    ++size;
    return true;
  }

private:
  struct Node{
    T value;
    std::unique_ptr<Node> next = nullptr;
    Node(T value_) noexcept
      : value(value_)
    { }
  };

  std::unique_ptr<Node> head = nullptr;
  std::size_t maxSize;
  std::size_t size = 0;
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы