Самопроизвольное изменение указателя с NULL в 0xcccccc (С++)

Вопросы по языкам программирования Си и С++.
burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Самопроизвольное изменение указателя с NULL в 0xcccccc (С++)

Сообщение burik » 08.06.2010 (Вт) 15:04

Всем привет.

Пишу класс AVL-дерева на C++ (если кто не знает - это самобалансирующееся дерево). Дерево хранится в памяти посредством такой вот структуры:
Код: Выделить всё
struct Tree {
   int key, value, height;
   Tree *p, *l, *r; // родитель, левое поддерево, правое поддерево
}


Видимо, я чего-то не понимаю, но суть проблемы в следующем.

При создании нового элемента, поля структуры l и r приравниваются к NULL. Однако, в определенный момент времени эти указатели становятся равными 0xcccccccc, в следствие чего не выполняется условие типа (node->l == NULL) и все работает некорректно.

Чем может быть вызвано такое явление?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Самопроизвольное изменение указателя с NULL в 0xcccccc (С++)

Сообщение Хакер » 08.06.2010 (Вт) 15:15

Только одним — кто-то по ошибке пишет эти данные туда, на какое место приходятся эти указатеоли.

Либо бракованая адресная арифметика, либо use-after-free.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Самопроизвольное изменение указателя с NULL в 0xcccccc (С++)

Сообщение burik » 08.06.2010 (Вт) 15:35

use-after-free - это, как я понял, использование указателя на память, которая была освобождена? Т.е. типа такого:
Код: Выделить всё
int *a = new int;
delete a;
*a = 5;

Я правильно понимаю?

А "бракованая адресная арифметика" это как? Точнее от чего она возникает?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Самопроизвольное изменение указателя с NULL в 0xcccccc (С++)

Сообщение Хакер » 08.06.2010 (Вт) 15:37

burik писал(а):use-after-free - это, как я понял, использование указателя на память, которая была освобождена? Т.е. типа такого:
Код: Выделить всё
int *a = new int;
delete a;
*a = 5;

Я правильно понимаю?


Скорее так:
Код: Выделить всё
int *a = new int;
delete a;
Something(); // Куча действий, требующих выделения памяти или вызов ждущих функций (Sleep, WaitForXXX и т.п.)
*a = 5;
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Самопроизвольное изменение указателя с NULL в 0xcccccc (С++)

Сообщение burik » 08.06.2010 (Вт) 15:45

Спасибо большое, вроде разобрался :)
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList