Эта функция-член
void push(T _item)
{
if (m_size + 1 == MAX_SIZE + 1)
{
throw StackOverflowException();
}
m_array[++m_top] = _item;
++m_size;
}
уже неверна. Предположим, что MAX_SIZE равен 1, а m_size равен 0. В этом случае m_size + 1 не равен MAX_SIZE + 1, и за выделенным массивом есть запись
m_array[1] = _item;
.
Редактировать: после того, как вы изменили метод следующим образом
void push(T _item)
{
if (m_size + 1 > MAX_SIZE)
{
throw StackOverflowException();
}
m_array[++m_top] = _item;
++m_size;
}
после того, как я указал на проблему с ним, на самом деле метод имеет ту же проблему. На самом деле вы ничего не похитили.
Также ваш стек не заполняет элемент с индексом 0. Так что в конструкторе
Stack(const Stack<T>& _other)
{
m_array = new T[MAX_SIZE];
for(auto i = 0; i < _other.size(); ++i)
{
m_array[i] = _other.m_array[i];
}
m_size = _other.size();
m_top = _other.m_top;
}
есть доступ к элементу с неопределенным значением впозиция 0
Нажатие функции-члена должно быть определено как
void push( const T &_item)
{
if (m_size == MAX_SIZE)
{
throw StackOverflowException();
}
m_array[m_top++] = _item;
++m_size;
}
, а другие функции-члены должны быть изменены в соответствии с нажимом функции-члена.