Почему я получаю bad_alloc?Реализация стека с ++ - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь реализовать свой собственный стек в C ++, но продолжаю получать эту ошибку, когда пытаюсь использовать метод pop (), в котором я пытаюсь сделать следующее:

  1. Сохраните элемент сверху в переменной с именем "res".
  2. Получите ссылку на следующий элемент из класса узла и установите его как верхнюю.
  3. size -
  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 голосов
/ 30 ноября 2018
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 - указатель на динамически размещаемый объект.

Обратите внимание, что вам придется управлять временем жизни этоговозражать как-то.В идеале вы бы не использовали необработанные указатели, чтобы у вас не было такого бремени.

...