0

于是我写了一个八叉树结构体,如下:

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::vectoror std::array),它会自动为您处理清理工作。如果您不准备使用现有的解决方案,那么您需要阅读三法则

于 2013-02-15T01:34:31.597 回答
1

由于您尚未为child数组分配动态内存,因此不应使用delete[]运算符来释放它。但是,您可以delete将该数组的每个单独元素释放每个单独的 child octree。然后这将调用每个孩子的析构函数。

A good rule to remember is that each new must have a matching delete (and vice versa). And each new[] must have a matching delete[] (and vice versa).

于 2013-02-15T01:42:41.523 回答
0

事实上,析构函数只会删除数组,不会删除子八叉树对象。您必须明确删除它们(当然,在删除数组之前)。

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

原因是在八叉树中,您要么没有孩子,要么没有 8 个孩子。

是的:当你删除一个octree实例时,它的析构函数将被调用。

于 2013-02-15T01:34:23.930 回答