Реализация дерева, приводящая к ошибке сегментации (дамп ядра) c ++ 11 - PullRequest
0 голосов
/ 25 апреля 2018

Недавно я закодировал связанный список с C ++ 11.Используя эти концепции, я попытался реализовать реализацию дерева {очень простого дерева} в C ++ 11.Но это дает мне ошибку сегментации.Я проверил онлайн и обнаружил, что это происходит, когда программа пытается записать доступ для чтения или пытается получить доступ к свободной памяти, но я не могу понять, как это происходит здесь.Пожалуйста, помогите ..

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

проверить изображение

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Ваша проблема в конструкторе:

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

Вы объявляете root в классе, но никогда не инициализируете его. Поэтому, когда вы разыменовываете его в теле конструктора, вы разыменовываете указатель мусора, который может указывать на что угодно. Строго говоря, то, что вы делаете, - это неопределенное поведение, и компилятор вполне может генерировать , что ему нравится или даже вообще ничего для этого бита кода.

Несвязанный нитпик: не используйте NULL в новом коде, используйте nullptr.

0 голосов
/ 25 апреля 2018

t.root неинициализирован, поэтому запись в root->left и root->right в конструкторе tree вызывает неопределенное поведение.

Прямо сейчас, ваш tree класс не имеет особого смысла. Он содержит указатель узла root, но вы никогда не используете его. createnode может быть просто свободной функцией или статическим членом node. Лучше было бы полностью инкапсулировать узлы и просто tree иметь метод insert, который принимает int, создает новый узел и вставляет его в соответствующее место в дереве.

...