【问题标题】:C++ Error in my own stack class我自己的堆栈类中的 C++ 错误
【发布时间】:2015-05-25 17:53:36
【问题描述】:

这是一个带有我的 Stack 类的程序:

    #include <iostream>
    using namespace std;
    template <class T>
    struct Node{
        T element;
        Node<T> *prevElement;
    };

    template <class T>
    class Stack {
    private:
        unsigned int NumberOfElements;
        Node<T> *tempAdr;
        Node<T> *topElement;
    public:
        Stack(){
            topElement = new Node<T>;
            topElement->prevElement = nullptr;
            NumberOfElements = 0;
        }
        ~Stack(){
            delete topElement;
        }

        void push(T input_element){
            tempAdr = topElement->prevElement;
            topElement = new Node<T>;
            topElement->element = input_element;
            topElement->prevElement = tempAdr;
            NumberOfElements++;
        }

        void pop(){
            tempAdr = topElement->prevElement;
            delete topElement;
            topElement = tempAdr;
            NumberOfElements--;
        }

        T top(){
            return topElement->element;
        }

        unsigned int size(){
            return NumberOfElements;
        }

    };

    int main(){
        Stack<int> MyStack;
        MyStack.push(17);
        MyStack.push(18);
        MyStack.pop();
        cout << MyStack.top()<<" "<<MyStack.size();
        system("pause");
        return 0;
    }

预期输出是

17 1

但是当我运行代码时,我收到了错误消息:

LB_4_RealStack.exe 中 0x00EE5FA9 处的未处理异常:0xC0000005: 访问冲突读取位置 0x00000000。

那么,你们能帮我找出错误吗?我一遍又一遍地查看我的代码,但我没有找到异常的原因。

【问题讨论】:

  • 你没有提到哪一行抛出了异常。
  • @user2079303 return topElement-&gt;element; 在我的 top() 方法中
  • 您应该将该信息添加到问题中。
  • 错误消息清楚地表明您正在取消引用空指针。逐行、逐个操作地检查您的代码,并确定它与您在开始之前写在纸上的算法的不同之处。
  • 是的,真的。感谢关注

标签: c++ exception stack


【解决方案1】:

我认为错误出在您的 push() 方法中,即第一条指令。

实际上你在代码中得到的是将元素添加到从顶部开始的下一个元素的顶部(忽略当前顶部),所以如果你重写方法如下:

void push(T input_element){
    tempAdr = topElement;
    topElement = new Node<T>;
    topElement->element = input_element;
    topElement->prevElement = tempAdr;
    NumberOfElements++;
}

它应该可以工作。

【讨论】:

  • 你是对的。我用你的改变了我的 push() 方法,它工作得很好。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 2023-01-28
  • 2020-09-02
  • 1970-01-01
  • 2016-01-17
  • 2016-02-11
  • 2012-07-14
  • 2017-08-15
相关资源
最近更新 更多