Как правильно очистить память при работе со стеком (ADT)?
А если комментарий //delete node; заменить на код, реально удаляющий ноду?
Ну и push() неправильно сделан. Хранить node надо как указатель Node*, в конструкторе инициализировать NULL, в push:tempNode->data = value;
tempNode->next = node;
node = tempNode;
Рекомендую почитать про 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;
};