0

オクトリーがあり、そのブランチで検索されたノードを削除する必要があります。プログラムはノードを見つけることができますが、削除するのに苦労しています。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
  • 子 0x0050078c {0x00000004 {値=??? child=0x00000008 {???, ???, ???, ???, ???, ???, ???, ???} }, 0xfdfdfdfd {...}, ...} オクトリー::ノード *[8]
  • [0] 0x00000004 {値=??? child=0x00000008 {???, ???, ???, ???, ???, ???, ???, ???} } Octree::node *
  • [1] 0xfdfdfdfd {値=??? child=0xfdfdfe01 {???, ???, ???, ???, ???, ???, ???, ???} } Octree::node *
  • [2] 0xdddddddd {値=??? child=0xddddddde1 {???, ???, ???, ???, ???, ???, ???, ???} } Octree::node *
  • [3] 0x29122f71 {値=??? child=0x29122f75 {???, ???, ???, ???, ???, ???, ???, ???} } Octree::node *
  • [4] 0x0000a9bd {値=??? child=0x0000a9c1 {???, ???, ???, ???, ???, ???, ???, ???} } Octree::node *
  • [5] 0x004d5228 {value=5249384 child=0x004d522c {0x005007a0 {value=5067304 child=0x005007a4 {0x004fe218 {...}, ...} }, ...} } Octree::node *
  • [6] 0x004fe218 {値=5244832 子=0x004fe21c {0x004d00c4 {値=5235224 子=0x004d00c8 {0x00501968 {...}, ...} }, ...} } Octree::node *
  • [7] 0xdddddddd {値=??? child=0xddddddde1 {???, ???, ???, ???, ???, ???, ???, ???} } Octree::node *
  • this 0x0043f818 {root=0x005006b0 {value=0 child=0x005006b4 {0x00000000 , 0x00000000 , 0x00000000 , ...} } } オクトリー *

ノードを削除した後にノードを変更したことがないため、その理由が本当にわかりません。そして、それがデストラクタでその例外を受け取った理由だと思います。ノードを削除するにはどうすればよいですか? たぶんキャッチしてみてください?

ヘッダーファイルは次のとおりです。

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

0 に答える 0