最近,我用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->left
和root->right
会调用未定义的行为。
现在,你的tree
课并没有多大意义。 它包含一个root
节点指针,但你从不使用它。createnode
可能只是一个自由函数或node
的静态成员。 更好的方法是完全封装节点,tree
有一个insert
方法,该方法采用int
,创建一个新节点,并将其插入树中的适当位置。
您的问题出在构造函数中:
class tree{
public:
node *root;
tree(){
root->left=NULL;
root->right=NULL;
}
在类中声明root
,但从不初始化它。因此,当您在构造函数的主体中取消引用它时,您正在取消引用可能指向任何内容的垃圾指针。 严格来说,你正在做的事情是未定义的行为,编译器完全有权为那段代码生成它喜欢的任何内容,甚至根本不生成
任何内容。不相关的吹毛求疵:不要在新代码中使用NULL
,使用nullptr
.