C++ 奇怪的分段故障就在主电路的开始处
下面的代码显示了分段错误。然而,当我把C++ 奇怪的分段故障就在主电路的开始处,c++,class,struct,C++,Class,Struct,下面的代码显示了分段错误。然而,当我把coutcity=cityName; x->next=NULL; } void printCity(){ cout city在Vertex构造函数中,您似乎没有初始化x。这会导致取消引用时出现未定义的行为,因此它仅在某些情况下崩溃这一事实是偶然的,与此无关。您需要首先修复未定义的行为: X为什么是指针,这并不特别清楚,所以考虑删除它的声明中的间接。(代码> */COD>)如果使用指针是有意的,则需要分配一些内存来保存结构并在X.< /P>开始之前初始化它。
coutcity=cityName;
x->next=NULL;
}
void printCity(){
cout city在Vertex
构造函数中,您似乎没有初始化x
。这会导致取消引用时出现未定义的行为,因此它仅在某些情况下崩溃这一事实是偶然的,与此无关。您需要首先修复未定义的行为:
X为什么是指针,这并不特别清楚,所以考虑删除它的声明中的间接。(代码> */COD>)如果使用指针是有意的,则需要分配一些内存来保存结构并在X.< /P>开始之前初始化它。
此代码还存在一些风格问题,可能会给您带来麻烦:
您可能希望将显式
函数说明符添加到构造函数中,以避免从字符串
进行意外的隐式转换
如果保留指针字段,几乎肯定会希望替换自动生成的构造函数(默认值,copy)并实现析构函数
#包括
使用名称空间std;
类型定义结构节点{
字符串城市;
节点*下一步;
}节点;
类顶点{
公众:
顶点(字符串cityName){
x=新节点();
x->city=cityName;
x->next=nullptr;
}
void printCity(){
还有三件事吗
您还可以使用唯一\u ptr
而不是原始指针来确保不会泄漏内存,请将代码更改为
还因为您按值接受字符串,考虑将其移动到节点类实例中(也可以将其转发到<代码>节点< /COD>)的构造器
在C++11及更高版本中,首选nullptr
而不是NULL
将您的代码与此匹配
#include <iostream>
#include <memory>
using namespace std;
typedef struct node{
string city;
node * next;
} Node;
class Vertex{
public:
Vertex(string cityName) : x{std::make_unique<Node>()} {
x->city = std::move(cityName);
x->next = nullptr;
}
void printCity() {
cout << x->city << endl;
}
private:
std::unique_ptr<Node> x;
};
int main() {
//cout << endl;
Vertex x("Phoenix");
x.printCity();
return 0;
}
#包括
#包括
使用名称空间std;
类型定义结构节点{
字符串城市;
节点*下一步;
}节点;
类顶点{
公众:
顶点(字符串cityName):x{std::make_unique()}{
x->city=std::move(cityName);
x->next=nullptr;
}
void printCity(){
数据成员x
是否未初始化;它始终是一个悬空指针。@宋元耀这是什么意思?我如何修复它?如果可能,不要使用原始指针,只要Node x;
就可以了。如果必须,请在使用它之前在构造函数中添加x=new Node;
。(并实现析构函数以删除它,以及复制/移动构造函数、赋值运算符等,请参见)正如我所说的,你可以只是<代码>节点X;,即根本不使用指针。或者考虑一下。这个答案可以从解释如何修复它中受益。OP可能不是C++专家,而且不可能从你所说的中获益,即使它在技术上是正确的。@ TASI在精炼它的过程中。如果您认为缺少任何内容,请随时编辑我的更新答案。如果可以,请更改指向唯一\u ptr
的指针类型,如果可能,应立即通知OP最佳做法
#include <iostream>
using namespace std;
typedef struct node{
string city;
node * next;
} Node;
class Vertex{
public:
Vertex(string cityName) {
x = new Node();
x->city = cityName;
x->next = nullptr;
}
void printCity() {
cout << x->city << endl;
}
~Vertex(){
delete x;
}
private:
unique_ptr<Node> x;
};
int main() {
Vertex x("Phoenix");
x.printCity();
return 0;
}
#include <iostream>
#include <memory>
using namespace std;
typedef struct node{
string city;
node * next;
} Node;
class Vertex{
public:
Vertex(string cityName) : x{std::make_unique<Node>()} {
x->city = std::move(cityName);
x->next = nullptr;
}
void printCity() {
cout << x->city << endl;
}
private:
std::unique_ptr<Node> x;
};
int main() {
//cout << endl;
Vertex x("Phoenix");
x.printCity();
return 0;
}