Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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+的树实现+;11_C++_Tree_Segmentation Fault - Fatal编程技术网

C++ 给出分段错误(核心转储)错误c+的树实现+;11

C++ 给出分段错误(核心转储)错误c+的树实现+;11,c++,tree,segmentation-fault,C++,Tree,Segmentation Fault,最近,我用C++11编写了链表。使用这些概念,我尝试在C++11中编写tree{一个非常基本的tree}实现。但这给了我一个分割错误。我在网上查了一下,发现当程序试图写入读访问内存或试图访问空闲内存时,就会发生这种情况,但我不知道它是如何发生的。请帮忙 #include<iostream> #include<cstdlib> using namespace std; struct node{ node *left; node *right; int

最近,我用C++11编写了链表。使用这些概念,我尝试在C++11中编写tree{一个非常基本的tree}实现。但这给了我一个分割错误。我在网上查了一下,发现当程序试图写入读访问内存或试图访问空闲内存时,就会发生这种情况,但我不知道它是如何发生的。请帮忙

#include<iostream>
#include<cstdlib>
using namespace std;
struct node{
    node *left;
    node *right;
    int key;
};
class tree{
    public:
    node *root;
    tree(){
        root->left=NULL;
        root->right=NULL;
    }
    node *createnode(int data){
        node *temp=new node;
        temp->key=data;
        temp->left=NULL;
        temp->right=NULL;
        return temp;
    }
};
int main(){
    tree t;
    node *root;
    root=t.createnode(1);
    //root->left=t.createnode(2);
    //root->right=t.createnode(3);
    //root->left->left=t.createnode(9);
    //root->left->right=t.createnode(7);
return 0;
}
#包括
#包括
使用名称空间std;
结构节点{
节点*左;
节点*右;
int键;
};
类树{
公众:
节点*根;
树(){
根->左=空;
root->right=NULL;
}
节点*createnode(int数据){
node*temp=新节点;
温度->键=数据;
temp->left=NULL;
temp->right=NULL;
返回温度;
}
};
int main(){
树t;
节点*根;
root=t.createnode(1);
//root->left=t.createnode(2);
//root->right=t.createnode(3);
//根->左->左=t.createnode(9);
//根->左->右=t.createnode(7);
返回0;
}

t.root
未初始化,因此在
树的构造函数中写入
root->left
root->right
会调用未定义的行为


现在,您的
类没有什么意义。它包含一个
根节点指针,但您从未使用过它
createnode
可以是一个自由函数,也可以是
node
的静态成员。最好是完全封装节点,只使用
tree
insert
方法,该方法采用
int
,创建一个新节点,并将其插入树中的适当位置。

t.root
未初始化,因此,在
树的构造函数中写入
根->左
根->右
,会调用未定义的行为


现在,您的
类没有什么意义。它包含一个
根节点指针,但您从未使用过它
createnode
可以是一个自由函数,也可以是
node
的静态成员。最好是完全封装节点,只使用
插入
方法,该方法采用
int
,创建一个新节点,并将其插入树中的适当位置。

您的问题在于构造函数:

class tree{
    public:
    node *root;
    tree(){
        root->left=NULL;
        root->right=NULL;
    }
在类中声明
,但从不初始化它。因此,当您在构造函数体中取消引用它时,您正在取消引用一个垃圾指针,该指针可以指向任何东西。 严格地说,您在那里所做的是未定义的行为,编译器完全有权为该位代码生成它喜欢的任何内容,甚至什么都不生成


不相关的挑剔:不要在新代码中使用
NULL
,使用
nullptr

您的问题在于构造函数:

class tree{
    public:
    node *root;
    tree(){
        root->left=NULL;
        root->right=NULL;
    }
在类中声明
,但从不初始化它。因此,当您在构造函数体中取消引用它时,您正在取消引用一个垃圾指针,该指针可以指向任何东西。 严格地说,您在那里所做的是未定义的行为,编译器完全有权为该位代码生成它喜欢的任何内容,甚至什么都不生成


不相关的挑剔:不要在新代码中使用
NULL
,在
tree()
中使用
nullptr

您访问变量
root
,但您没有初始化它。在
tree()
中,您访问变量
root
,但您没有初始化它。谢谢,我初始化了它,它工作了。但我没听清楚你的最后一句话。完全封装节点是什么意思?你能给我举个例子吗?@JimmyFails我的意思是将
节点
私有化为
,这样
类的用户根本不需要知道它或与它交互。将其作为实现细节,而不是
接口的一部分。例如,
std::map
有一个内部使用的
node
类,但是要使用
std::map
您不必知道或思考节点。谢谢,我初始化了它,它成功了。但我没听清楚你的最后一句话。完全封装节点是什么意思?你能给我举个例子吗?@JimmyFails我的意思是将
节点
私有化为
,这样
类的用户根本不需要知道它或与它交互。将其作为实现细节,而不是
接口的一部分。例如,
std::map
有一个内部使用的
node
类,但是要使用
std::map
您不必知道或考虑节点。