0

そこで、次のようにoctree構造体を作成しました。

struct octree{
    static const int maxdepth=8;
    octree* child[8];
    uint32_t rgb;//candidates for the extra 8 bits: alpha, lighting, shape(to reduce size)
    uint8_t shape;
    ~octree(){delete[] child;}
};

私が抱えている懸念はデストラクタにあります...
それは子供たちのデストラクタと呼ばれるのでしょうか、それとも私はそれを自分でしなければならないのでしょうか?

4

4 に答える 4

1

いいえ、これは完全に壊れています。配列を呼び出すdeleteと、未定義の動作が発生します。各要素を個別に削除する必要があります (削除することが適切であると仮定します)。

はるかに優れたソリューションは、クリーンアップを自動的に処理するコンテナー クラス (std::vectorまたは など) を使用することです。std::array既存のソリューションを使用する準備ができていない場合は、Rule of Threeについて読む必要があります。

于 2013-02-15T01:34:31.597 に答える
1

child配列に動的メモリを割り当てていないため、delete[]演算子を使用して解放しないでください。ただしdelete、その配列の個々の要素をそれぞれ個々の子を解放することができますoctree。これにより、各子のデストラクタが呼び出されます。

覚えておくべき良いルールは、それぞれnewが一致している必要があるということですdelete(逆も同様です)。そして、それぞれnew[]が一致している必要がありますdelete[](逆も同様です)。

于 2013-02-15T01:42:41.523 に答える
0

このままでは、デストラクタは配列のみを削除し、子の octree オブジェクトは削除しません。それらを明示的に削除する必要があります (もちろん、配列を削除する前に)。

于 2013-02-15T01:33:35.977 に答える
0

あなたが宣言したのは、8 つのoctree*値の配列です。アレイ自体を削除することはできません。

代わりにこれを行う必要があります:

for( int i = 0; i < 8; i++ )
    if( child[i] ) delete child[i];

それらをすべて一度に削除したい場合は、次のように定義できます。

octree * child;

//...
child = new octree [8];

//...
delete [] child;

その理由は、octree には子がないか、8 個の子があるためです。

はい:octreeインスタンスを削除すると、そのデストラクタが呼び出されます。

于 2013-02-15T01:34:23.930 に答える