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;
    }