为什么我的C++程序在编译后就停止了工作

Why did my C++mprogram stop working after being compiled?

本文关键字:工作 编译 我的 C++ 程序 为什么      更新时间:2023-10-16

我是一名计算机科学专业的学生,在过去的一年里一直在用Java进行编码。现在我对学习C++很感兴趣。我想用C++编写的第一个程序是使用链表的堆栈实现,我在使用java之前已经对其进行了编码。我几乎不知道自己在做什么,基本上只是写我认为正确的东西,直到我没有编译错误。所以我终于做到了,我的程序没有编译错误,但当我运行它时,出现了一个弹出窗口,说我的"Stack.exe已经停止工作">

这是我的代码:`

#include <iostream>
using namespace std;
class Stack;
class Node;
class Node
{
public:
string element;
Node *next;
Node(string, Node);
};
Node::Node(string element, Node next)
{
this -> element = element;
*(this -> next) = next;
}
class Stack
{
private:
Node *tos;
public:
Stack()
{
tos = NULL;
}
void push(string str)
{
tos = new Node(str, *tos);
}
string peek()
{
return tos->element;
}
string pop()
{
string temp = tos->element;
tos = (tos->next);
return temp;
}
};
int main(void)
{
Stack bob;
bob.push("Wow");
bob.push("Wiw");
cout << bob.peek();
return 0;
}

有人能告诉我我做错了什么吗?我这样做是因为这就是我使用Java的方式。

谢谢:D

您在几个地方取消了对null或未定义指针的引用。首先让我们来看一下您的Node构造函数:

*(this -> next) = next;

由于next尚未定义,因此取消引用它会导致未定义的行为。在实践中,next会指向内存中某个您可能不拥有的随机位置,因此写入它会导致程序崩溃。Node构造函数应该将指向Node的指针作为其第二个参数,而不是按值取Node

Node::Node(string element, Node* next)
: element{element},
next{next}
{}

注意,我还初始化了Node的成员,而不是默认初始化它们,然后在构造函数的主体中为它们赋值。

在修复了Node的构造函数之后,您还需要修复Stack::push以传递指针而不是对象:

void push(string str)
{
tos = new Node(str, tos);
}

请注意,即使修复了崩溃问题,当Stack中的pop(或Stack被销毁时)时,您仍然会泄漏内存。你需要delete任何你new的东西,或者最好使用std::shared_ptr<Node>而不是原始Node*