Следующее является виновником.
template <class D>
void ArrayBasedStack<D>::push(D& data) {
if(t == arrSize) {
throw fsex;
} else {
S[t] = data; // Should be S[++t] = data;
t++; // Comment out this line
}
}
Эта реализация предполагает, что 't' указывает на самый верхний элемент в стеке, а не на следующее доступное место для push
Обратите внимание, что operator [] и operator ++ имеют одинаковый приоритет. Поскольку они ассоциируются слева направо, [] оценивается перед оператором ++.
В вашей реализации здесь проблема. При инициализации t в -1 вы переписываете за пределы индекса массива, который находится в S [-1], что приводит к undefined behavior
.
По крайней мере, в моей системе проблема возникает при попытке освободить память в деструкторе класса стека. Это классический пример того, что синдром был виден после того, как произошла глупость
Также предложит push
принять параметры как D const &