0
void node::assign_childs()
{
    node *childs;
    childs = new node[8];
    .
    .
    .
    child_pointer = &childs[0];
}

「child_pointer」のメモリを解放する方法を見つけるのに苦労しています。「child_pointer」は、以下に示すように構造体「node」で定義されます。

struct node{
    vect p;
    vect norm;
    float s;
    unsigned char r,g,b;
    int fac_c;
    vector<int> cfac;
    bool isParent;
    bool filled;

    struct node* child_pointer;

    node(vect, float , vect );
    ~node();

    void assign_childs();

};

delete を使用して child_pointer を解放しても機能しないようです。delete [] も試しました。

ルート ノードからすべての child_pointers を再帰的に解放するデストラクタを作成するにはどうすればよいですか?

(これは octree であるため、ノードを解放すると、そのノード内のすべてのノードも解放されます)

child_pointer を割り当て/定義する方法を変更して、解放できるようにする必要がある場合。どうすればいいですか?8 つのポインターの配列を使用することは、大量のメモリを使用するため、代替手段ではありません。

これが私が試したデストラクタです。

node::~node(){
    if (child_pointer != NULL){
        delete [] child_pointer;
    }
}

これを行うと、セグメンテーション違反でプログラムがクラッシュします。

node *octree(...);
.
.
.
delete octree;
4

1 に答える 1

3

デストラクタに次を追加するだけです。

delete[] child_pointer;

削除は子のデストラクタを呼び出し、削除は子の子のデストラクタを呼び出します。

delete と delete[] の使用方法を示すだけです。

int *foo = new int;
delete foo;

int *bar = new int[42];
delete[] bar;
于 2013-06-27T21:17:47.573 に答える