Консультация № 63785
23.11.2006, 00:17
0.00 руб.
0 2 1
Здравствуйте!
У меня такой вопрос!
У меня есть класс (см. приложение). Функция bool NewKl (int id) добавляет в дерево новый элемент, вставляя его после id-го по индексу. Корень дерева заведомо существует (создаётся в конструкторе). Функция работает правильно (в отладчике (f5)- всегда), но при запуске (ctrl+f5) в определённом сочетании команд вылезает ошибка. Отловить её я не могу, т.к. в пошаговом запуске ошибки нет. Но если вставить в код вывод, то ошибка исчезает. Помогите, пожалуйста!

der.NewKl (0);
der.NewKl (1);
der.NewKl (1);
der.NewKl (2);
der.NewKl (2);
der.NewKl (2); //на этом шаге ошибка

bool CMyTree::NewKl (int id)
{
Kletka* x; //for (int i=0; i<1000; i++);
//cout << 12 << 12 << ‘\n‘; Если добавить этот вывод, то ошибка исчезает
der = Poisk (&root, id);
if (der!=NULL) {
x=new Kletka;
kol++;
x->ind=kol;
x->zar=10;
x->kp=0;
x->deti=NULL;
x->rod=der;
if (der->kp==0) {
der->deti=new Kletka*; der->deti[0]=new Kletka; der->deti[0]=x;
der->kp=1;
} else {
der->deti[der->kp]=new Kletka; der->deti[der->kp]=x; der->kp++;
}
return true;
}
return false;
}

И ещё вопрос: надо ли дополнительно освобождать память из-под переменной der->deti (и если надо, то как - простой delete не проходит), если я уже удалила все der->deti[i]?

Приложение:
struct Kletka { int ind; //индекс int zar; int kp; Kletka* rod; Kletka** deti;};class CMyTree {private: Kletka* root; int kol; Kletka* Poisk (Kletka** rt, int id); void Viv (Kletka* rt, int ots); void Prisv (Kletka* ist, Kletka* kon); void DelAll (Kletka* rt);public: Kletka* der; CMyTree (); bool NewKl (int id); bool DelKl (int id); void Vivod (); ~CMyTree ();};

Обсуждение

Неизвестный
23.11.2006, 09:40
общий
это ответ
Здравствуйте, Verena!
Не буду точно утверждать так как, код предаставлен не весь, но мне кажется (практически уверен) что ошибка здесь
struct Kletka {
int ind; //индекс
int zar;
int kp;
Kletka* rod;
Kletka** deti; <-- вот здесь ошибка;
};
вы не виделяете память под массив указателей на детей
попробуйте воспользоваться vector ом для хранения ссылок на детей
struct Kletka {
...
std::vetor<Kletka*> deti;
}

Возникнут вопросы пишите.
Неизвестный
23.11.2006, 17:15
общий
Память выделяется - der->deti=new Kletka*, и такая конструкция допустима. К тому же, всё работает в других случаях и в отладчике тоже всё верно - я проверяла, память выделяется. И если бы были проблемы с этим, то ошибка возникала бы и при удалении. Проблема в том, что программа работает при запуске внутри среды, и глючит вне её!
Форма ответа