У меня есть Octree, и я должен удалить узел, который ищется по его ветке. Программа может найти узел, но я борюсь с его удалением. Когда я создаю объект моего Octree и создаю несколько узлов, но не удаляю их, тогда деструктор удаляет Octree:
Octree::~Octree()
{
clear(root);
}
void Octree::clear(node *node){
for (int i = 0; i < 8; i++)
if (node->child[i])
clear(node->child[i]);
delete node;
}
Но когда я хотел бы удалить конкретный узел с помощью этого метода,
void Octree::deletebranch(int branch) {
node *n = search(branch);
if (n) {
for (int i = 0; i < 8; i++) {
if (n->child[i]) {
delete n->child[i];
n->child[i] = NULL;
}
}
delete n;
n = NULL;
}
else {
printf("There is nothing to delete here");
}
}
Я получил исключение после вызова деструктора.
Исключение: нарушение прав на чтение.
узел был 0x4.
Я шаг за шагом отлаживал и обнаруживал некоторые странные вещи. Когда я создаю узел, я делаю это так:
n = new node;
n->value = xvalue;
for (int i = 0; i < 8; i++)
n->child[i] = NULL;
И все в порядке, я устанавливаю значение, а значение узла — xvalue, а потомки — NULL. Но после того как я удалил этот узел методом deletebranch (), мой узел изменился следующим образом.
Я действительно не понимаю, почему это так, потому что я никогда не менял узел после того, как удалил его.
И я думаю, именно поэтому я получил это исключение в деструкторе. Как мне удалить узел? Может попробовать поймать?
Вот заголовочный файл:
class Octree
{
public:
struct node
{
int value;
node *child[8];
};
Octree();
~Octree();
void clear(node* node);
int convert(int sorszam);
node* searchandset(int dec, int value);
node *search(int dec);
node* step(node *node, int k);
void Print(node *n)const;
void put(int branch, int value);
void deletebranch(int branch);
node *root;
};
Задача ещё не решена.
Других решений пока нет …