我是一名计算机科学专业的学生,过去一年一直使用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
答案 0 :(得分:1)
您在几个地方取消引用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);
}
请注意,即使在解决了崩溃问题之后,当您pop
(或Stack
被销毁时)Stack
时,您仍会泄漏内存。您需要delete
new
的任何内容,或者更好地使用std::shared_ptr<Node>
代替原始Node*
。