C++ 给出分段错误(核心转储)错误c+的树实现+;11
最近,我用C++11编写了链表。使用这些概念,我尝试在C++11中编写tree{一个非常基本的tree}实现。但这给了我一个分割错误。我在网上查了一下,发现当程序试图写入读访问内存或试图访问空闲内存时,就会发生这种情况,但我不知道它是如何发生的。请帮忙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
#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
您不必知道或考虑节点。