Проблема связана с функцией push (), 'newNode' является переменной в стеке, и компилятор автоматически вызывает свой деструктор в конце функции.
Чтобы избежать этого, вы должны использовать 'new'оператор для создания' newNode 'в куче, а функция pop () отвечает за освобождение памяти (используйте оператор' delete ').
Если операторы' new 'и' delete 'сбивают вас с толку, вы можетеиспользуйте вместо этого 'std :: shared_ptr'.
void push(int number) {
Node *NewNode = new Node{};
NewNode->node_value = number;
if (size == 0) {
node_pointer = NewNode;
cout << node_pointer << endl;
size++;
cout << "Pushed" << endl;
}
else if (size > 0)
{
NewNode->previous_node = node_pointer;
node_pointer = NewNode;
size++;
cout << "Pushed" << endl;
}
}
void pop() {
if (size > 1) {
Node* Temp_Node = node_pointer;
cout << Temp_Node->node_value << endl;
delete node_pointer;
node_pointer = Temp_Node->previous_node;
size--;
}
else if (size == 1) {
Node* Temp = node_pointer;
cout << Temp->node_value << endl;
delete node_pointer;
node_pointer = nullptr;
size--;
}
else {
cout << "empty" << endl;
}
}
Также вы можете воспользоваться SmartPointer: вы не несете ответственности за «новый» и «удаление» объекта в куче.
#include <memory>
using namespace std;
class Node {
using node_ptr = std::shared_ptr<Node>;
public:
int node_value;
node_ptr previous_node;
};
class Stack {
using node_ptr = std::shared_ptr<Node>;
public:
node_ptr node_pointer = nullptr;
int size = 0;
void push(int number) {
node_ptr NewNode = std::make_shared<Node>();
NewNode->node_value = number;
if (size == 0) {
node_pointer = NewNode;
cout << node_pointer << endl;
size++;
cout << "Pushed" << endl;
}
else if (size > 0)
{
NewNode->previous_node = node_pointer;
node_pointer = NewNode;
size++;
cout << "Pushed" << endl;
}
}
void pop() {
if (size > 1) {
node_ptr Temp_Node = node_pointer;
cout << Temp_Node->node_value << endl;
//delete node_pointer;
//no need to delete here, it will be automatically destructed when Temp_Node leaves this scope.
node_pointer = Temp_Node->previous_node;
size--;
}
else if (size == 1) {
node_ptr Temp = node_pointer;
cout << Temp->node_value << endl;
//delete node_pointer;
node_pointer = nullptr;
size--;
}
else {
cout << "empty" << endl;
}
}
};