Как удалить узел октрея c ++ (узел был 0x4.)

У меня есть 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 (), мой узел изменился следующим образом.

  • n 0x00500788 {значение = 0 дочерний = 0x0050078c {0x00000004 {значение = ??? child = 0x00000008 {???, ???, ???, ???, ???, …}}, …}} Octree :: node *
    значение 0 int
  • child 0x0050078c {0x00000004 {value = ??? child = 0x00000008 {???, ???, ???, ???, ???, ???, ???, ???}}, 0xfdfdfdfd {…}, …} Октри :: узел * [8]
  • [0] 0x00000004 {значение = ??? child = 0x00000008 {???, ???, ???, ???, ???, ???, ???, ???}} Octree :: node *
  • [1] 0xfdfdfdfd {значение = ??? child = 0xfdfdfe01 {???, ???, ???, ???, ???, ???, ???, ???}} Octree :: node *
  • [2] 0xdddddddd {value = ??? child = 0xdddddde1 {???, ???, ???, ???, ???, ???, ???, ???}} Octree :: node *
  • [3] 0x29122f71 {значение = ??? child = 0x29122f75 {???, ???, ???, ???, ???, ???, ???, ???}} Octree :: node *
  • [4] 0x0000a9bd {значение = ??? child = 0x0000a9c1 {???, ???, ???, ???, ???, ???, ???, ???}} Octree :: node *
  • [5] 0x004d5228 {значение = 5249384 дочерний = 0x004d522c {0x005007a0 {значение = 5067304 дочерний = 0x005007a4 {0x004fe218 {…}, …}}, …}} Octree :: node *
  • [6] 0x004fe218 {value = 5244832 child = 0x004fe21c {0x004d00c4 {value = 5235224 child = 0x004d00c8 {0x00501968 {…}, …}}, …}} Octree :: node *
  • [7] 0xdddddddd {value = ??? child = 0xdddddde1 {???, ???, ???, ???, ???, ???, ???, ???}} Octree :: node *
  • this 0x0043f818 {root = 0x005006b0 {value = 0 child = 0x005006b4 {0x00000000, 0x00000000, 0x00000000, …}}} Octree *

Я действительно не понимаю, почему это так, потому что я никогда не менял узел после того, как удалил его.
И я думаю, именно поэтому я получил это исключение в деструкторе. Как мне удалить узел? Может попробовать поймать?

Вот заголовочный файл:

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;
};

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]