Неверное чтение, даже если объект существует - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь реализовать самобалансирующееся дерево двоичного поиска.Когда я пытаюсь получить высоту правой ветви, это работает, пока я не достигну этой точки.Затем я получаю ошибку ошибки сегментации, и valgrind говорит, что было неверное чтение размера 8. Странно, когда я смотрю на дерево, когда возникает эта ошибка, правая ветвь не равна нулю.Есть ли какая-то проверка, которую я забыл сделать и которая вызывает эту ошибку?

Строки, в которых выдается ошибка:

int rightChildHeight = 0;
if (n->right != NULL)
    rightChildHeight = n->right->getHeight();

getHeight ():

int Node::getHeight()
{
// No kids => 2
if (!left && !right)
    return 1;
// 1 kid => height of kid +1
else if (!left && right)
    return right->getHeight() + 1;
else if (left && !right)
    return left->getHeight() + 1;
// 2 kids => height of taller kid +1
else
    return max(left->getHeight(), right->getHeight()) + 1;
}

Дерево при возникновении ошибки:

Tree when the error occurs.

1 Ответ

0 голосов
/ 29 ноября 2018

Проверьте, инициализируете ли вы указатели left и right как nullptr.Вероятно, это не так, и он получает случайные данные из этой области памяти, делает указатель существующим, но он не указывает на объект со свойством right.Также, если вы удалите какой-либо узел до этого, покажите нам метод удаления и метод вставки.Возможно, проблема в одной из этих функций.

Также вы должны попытаться соответствовать своему коду, сначала вы проверяете на обнуляемость, как этот if (n->right != NULL), а после этого if (!left && !right), честно говоря, я предпочитаюВторой способ - чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...