Дамп ядра при реализации обходов бинарного дерева - PullRequest
1 голос
/ 10 апреля 2020

Я пытался реализовать двоичное дерево с персонами. У любого человека есть отец и мать. В моей функции main () она работает хорошо, пока я не добавлю человека к моему первому отцу "X". Мой основной получает ошибку Aborted (core dumped) при 4-м вызове addFather ("Y", "F"), и я не могу понять, в чем моя ошибка.

Person& findPerson(Person* root, string child_name){
    if(root == nullptr) throw exception();
    else if(root->name.compare(child_name) == 0) return *root;
    else{
        if(root->father == nullptr)return findPerson(root->mother, child_name);
        else if(root->mother == nullptr)return findPerson(root->father, child_name);
        else {
            return findPerson(root->mother, child_name);
            return findPerson(root->father, child_name);
        }

    }
}

family::Person::Person(string person_name){
    name = person_name;
    father = nullptr;
    mother = nullptr;

};

family::Person::Person(string person_name, bool is_male){
    name = person_name;
    father = nullptr;
    mother = nullptr;
    isMale = is_male;

};



// TREE
family::Tree::Tree(string name){
    root = new Person(name);
};

family::Tree& Tree::addFather(string child, string father){
    Person& child_found = findPerson(root, child);
    Person* f = new Person(father, true);
    child_found.father = f;

    return *this;
    };


family::Tree& family::Tree::addMother(string child, string mother){
    Person& child_found = findPerson(root, child);
    Person* f = new Person(mother, false);
    child_found.mother = f;
    return *this;
    };
int main(){
    Tree t("X");

    t.addFather("X","Y");
    t.addMother("X", "Z");
    t.addFather("Z", "W");
    t.addFather("Y","F");
    return 0;
}

1 Ответ

0 голосов
/ 10 апреля 2020

Ваш код нуждается в работе, но одна подсказка состоит в том, что если вы бросаете исключение, вы должны поймать его . В C ++ неясно определено, что происходит, когда исключение не перехватывается, и поэтому это может быть вашей проблемой.

Так, например,

if(root->father == nullptr)return findPerson(root->mother, child_name);

не проверяет, ОБА мать и отец нулевые. Если это так, он вызовет findPerson с nullptr. После этого функция сгенерирует throw.

Как подсказка, в системе linux лучший способ найти эти проблемы - использовать gdb. Команда «catch throw», за которой следуют «start» и «continue», перехватит любые сгенерированные исключения. «БТ» покажет вам, как вы туда попали. GDB - это (давайте посмотрим правде в глаза) ужасный откат, который непроницаем для большинства новичков, однако, как и vi, это хороший навык, чтобы знать хотя бы основы.

Краткое руководство по началу работы. https://beej.us/guide/bggdb/

...