为什么我得到bad_alloc?实现堆栈C ++

时间:2018-11-30 16:19:07

标签: c++ c++11 pointers stack bad-alloc

我正在尝试用C ++实现自己的Stack,但是当我尝试使用pop()方法时,却一直收到此错误:

  1. 从顶部将元素保存在名为“ res”的变量中。
  2. 从节点类中获取对下一个元素的引用,并将其设置为顶部。
  3. 大小-
  4. 返回变量“ res”。

如果您能帮助我,我将不胜感激。谢谢!

节点类:

template<class T>
class Node {
private:
    Node<T>* next;
    T element;

public:
    Node();

    Node(const Node& orig);

    ~Node();

    void setElement(T el);

    T getElement();

    Node<T>* getNext();

    void setNext(Node<T>* ne);
};

堆栈类:

#include "EmptyStackException.cpp"
#include "Node.cpp"
#include <iostream>

using namespace std;

template<class T>
class LinkedStack {
private:
    int siz;
    Node<T>* first;

public:
    LinkedStack();

    ~LinkedStack();

    int size();

    bool isEmpty();

    void push(T e);

    T top();

    T pop();
};

template<class T>
void LinkedStack<T>::push(T e) {
    Node<T> node = Node<T>();
    node.setNext(first);
    node.setElement(e);
    first = &node;
    siz++;
}

template<class T>
T LinkedStack<T>::pop() {
    T res = first->getElement();
    first = *(first->getNext());
    siz--;
}

1 个答案:

答案 0 :(得分:1)

template<class T>
void LinkedStack<T>::push(T e) {
    Node<T> node = Node<T>();
    node.setNext(first);
    node.setElement(e);
    first = &node;
    siz++;
}

由于node是此函数的本地对象,因此一旦函数结束,它就会被销毁。但是,first包含一个指向它的指针。因此,当此函数返回时,first包含一个指向不再存在的对象的指针。您可能想要这样:

template<class T>
void LinkedStack<T>::push(T e) {
    Node<T>* node = new Node<T>();
    node->setNext(first);
    node->setElement(e);
    first = node;
    siz++;
}

现在,当该函数返回时,node仍然不存在。但是first不包含指向node的指针,它包含node的值-指向动态分配对象的指针。

请注意,您将必须以某种方式管理该对象的生存期。理想情况下,您将不使用原始指针,以免造成负担。