为什么我的C++程序在编译后就停止了工作
Why did my C++mprogram stop working after being compiled?
我是一名计算机科学专业的学生,在过去的一年里一直在用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*
。
相关文章:
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 编译"运算符删除"时C++编译器如何工作?
- 在调试配置中编译工作正常,但发布会给出链接错误
- 重新编译我们的FORTRAN代码并在C++中使用后,我们的system()或C_str()命令无法正常工作
- 编译的谷歌协议缓冲区不工作(C++)
- 我的 PowerShell 脚本无法按预期工作(用于编译C++文件)
- C++编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败
- C Visual Studio代码不使用工作区中的单个文件夹编译
- 如何编译Freetype(2)和Harfbuzz(带有Visual studio)使它们协同工作?
- CLion 无法解析类型 std::unordered_map,即使它提示我包含标头并且编译工作
- GCC 和 clang 抛出"no matching function call"但 msvc (cl) 按预期编译和工作
- 当其中一个函数未编译时,函数重载查找如何工作?
- C++程序使用 mingw 在 Linux 上交叉编译在 MSy2 中工作,但不能直接在 Windows 中工作
- 为什么三元运算符在编译时的工作方式与运行时不同?
- 初始化静态成员使编译工作.但是为什么
- 指针的C++重载运算符=无法正常工作/编译
- SDL c++: if函数不工作.编译精细-逻辑错误
- auto_ptr未按预期工作-编译错误
- 获取浮点模板参数工作编译的"hack",但在 g++ 和 clang 上都存在段错误