为什么我的C ++ mprogram在编译后停止工作?

时间:2016-06-13 01:39:02

标签: c++

我是一名计算机科学专业的学生,​​过去一年一直使用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

1 个答案:

答案 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*