我正在尝试实现一个堆栈类,并且出于某种原因,当我尝试执行pop操作时,程序第二次崩溃。
我已经逐步完成调试器并发现当我在delete top
函数中尝试pop
时发生错误。
我已经玩了一个小时的大部分时间并没有运气。我正在对简单的整数值进行测试,因为该类是模板化的。 top
仅仅是当前堆栈顶部的StackNode<T>*
。我尝试通过创建临时指针并将其设置为等于top-&gt; next来修改它。
在我删除top之后,我尝试将top重置为temp指针,该指针应该指向数据结构中的下一个逻辑对象。
在函数的第二次迭代中,delete top
抛出实际异常。
有什么想法吗?
int main()
{
Stack<int> testStack;
testStack.PushBack(5);
testStack.PushBack(10);
testStack.PushBack(12);
testStack.PushBack(15);
int testThisInt = testStack.pop();
//BREAKS ON THIS CALL TO MEMBER FUNCTION POP
int testThisSecondInt = testStack.pop();
for (int x = 0; x < 10; x++)
testStack.PushBack(x);
testStack.Clear();
cout << testThisInt << ' ' << testThisSecondInt << endl;
if (testStack.IsEmpty())
cout << "EMPTY WORKED!\n";
return 0;
}
template <class T>
void Stack<T>::PushBack(T newData)
{
StackNode<T>* newTemp = new StackNode<T>(newData);
if (top != nullptr)
{
newTemp->next = top;
top = newTemp;
}
else
top = newTemp;
}
template <class T>
T Stack<T>::pop()
{
StackNode<T>* temp = top->next;
T dataTemp = top->data;
delete top;
top = temp;
return dataTemp;
};
template <class T>
class Stack
{
private:
StackNode<T>* top;
public:
Stack(StackNode<T>* newTop = nullptr) : top(newTop) {};
~Stack() { this->Clear(); };
T pop();
T GetTop() const { return top->GetData; };
void PushBack(T newData);
void Clear();
bool IsEmpty() { return top == nullptr; };
};
template <class T>
class StackNode
{
private:
StackNode<T>* next;
T data;
public:
StackNode(T newData = T(), StackNode<T>* newNext = nullptr) : data(newData), next(newNext) {};
~StackNode() { delete next; next = nullptr; };
T GetData() const { return data; };
friend class Stack<T>;
};