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



最近,我用C++11编码了链表。使用这些概念,我尝试在 C++11 中编写 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;
}

检查图像

t.root

是未初始化的,因此在tree的构造函数中写入root->leftroot->right会调用未定义的行为。

现在,你的tree课并没有多大意义。 它包含一个root节点指针,但你从不使用它。createnode可能只是一个自由函数或node的静态成员。 更好的方法是完全封装节点,tree有一个insert方法,该方法采用int,创建一个新节点,并将其插入树中的适当位置。

您的问题出在构造函数中:

class tree{
public:
node *root;
tree(){
root->left=NULL;
root->right=NULL;
}

在类中声明root,但从不初始化它。因此,当您在构造函数的主体中取消引用它时,您正在取消引用可能指向任何内容的垃圾指针。 严格来说,你正在做的事情是未定义的行为,编译器完全有权为那段代码生成它喜欢的任何内容,甚至根本不生成

任何内容。不相关的吹毛求疵:不要在新代码中使用NULL,使用nullptr.

相关内容

  • 没有找到相关文章

最新更新