在八叉树数组上调用delete

时间:2013-02-15 01:28:34

标签: c++ destructor 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 个答案:

答案 0 :(得分:1)

不,这完全被打破了。在数组上调用delete会导致未定义的行为。您需要单独删除每个元素(假设它们适合删除它们)。

更好的解决方案是使用容器类(例如std::vectorstd::array),它会自动处理清理工作。如果您不准备使用现有解决方案,那么您需要阅读Rule of Three

答案 1 :(得分:1)

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

要记住的一条好规则是每个new必须匹配delete(反之亦然)。每个new[]必须匹配delete[](反之亦然)。

答案 2 :(得分:0)

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

答案 3 :(得分: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实例时,将调用其析构函数。