Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的C++;程序编译后是否停止工作?_C++ - Fatal编程技术网

C++ 为什么我的C++;程序编译后是否停止工作?

C++ 为什么我的C++;程序编译后是否停止工作?,c++,C++,我是一名计算机科学专业的学生,在过去的一年里一直在用Java编程。现在我对学习C++感兴趣。第一个我想用C++编码的程序是使用链表的栈的实现,我在使用java之前已经对它进行了编码。我几乎不知道我在做什么,基本上只是写我认为正确的东西,直到我没有编译错误。所以我最终做到了,我的程序没有编译错误,但当我运行它时,一个弹出窗口显示我的“Stack.exe已停止工作” 这是我的密码:` #include <iostream> using namespace std; class Sta

我是一名计算机科学专业的学生,在过去的一年里一直在用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;
}
#包括
使用名称空间std;
类堆栈;
类节点;
类节点
{
公众:
字符串元素;
节点*下一步;
节点(字符串,节点);
};
节点::节点(字符串元素,节点下一个)
{
这个->元素=元素;
*(这个->下一个)=下一个;
}
类堆栈
{
私人:
节点*tos;
公众:
堆栈()
{
tos=NULL;
}
空推(字符串str)
{
tos=新节点(str,*tos);
}
字符串peek()
{
返回tos->element;
}
字符串pop()
{
字符串temp=tos->element;
tos=(tos->next);
返回温度;
}
};
内部主(空)
{
堆栈bob;
鲍勃。推(“哇”);
鲍勃。推(“Wiw”);

cout您在几个地方取消了对空指针或未定义指针的引用。首先让我们看看您的
节点
构造函数:

*(this -> next) = next;
由于
next
尚未定义,取消引用它会导致未定义的行为。实际上,
next
将指向内存中可能不属于您的某个随机位置,因此写入它将导致程序崩溃。您的
节点
构造函数应将指向
节点的指针作为其第二个参数不是按值获取
节点

Node::Node(string element, Node* next)
    : element{element},
      next{next}
{}
注意,我还初始化了
节点的成员,而不是默认地初始化它们,然后在构造函数的主体中分配给它们

在修复
节点的构造函数之后,还需要修复
堆栈::push
以传递指针而不是对象:

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

请注意,即使修复了崩溃问题,当从
堆栈
中弹出
时(或当
堆栈
被销毁时),仍会泄漏内存你需要<代码>删除<代码>任何你的代码>新的< /代码>,或者更好地使用<代码> STD::SyrdYPPTR < /C> >而不是原始<代码>节点*< /C> > /S> < /P> C++中的对象以完全不同于java的方式工作。在爪哇中,很多方法都没有等价的。这里是其中之一。你需要退一步,从开始就开始学习C++。在代码中有很多问题。不解释对象如何在C++中工作,这是不可能的,这是整个书的主题,而不是StAccOffl的简短的400个字符注释。对不起,其中一个问题是:C++有一个<代码>删除>代码,而不是一个内置的垃圾收集器。你需要使用它。这里的问题不是缺少<代码>删除>代码>语句,而是对类和类实例(A.K.Abjts)的根本理解缺乏。在C++中工作。显示构造函数的第一件事就是取消引用未初始化的指针。Kaboom。未定义的行为。显然是因为“this -> Next=Next;没有编译,OP发现在它前面粘贴一个解引用操作符会使它编译,所以这一定是正确的做法,完全忽略了一个痛苦的事实,即构造函数的参数显然应该是指针,等等等等……我这样做是因为我用Java就是这样做的。--不要使用Java作为编写C++代码的模型,这是灾难的处方。