所以我写了一个八叉树结构,如下所示:
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;}
};
我关心的是析构函数
它会调用孩子们的析构函数吗?还是我必须自己这么做?
不,这完全坏了。对数组调用delete
会导致未定义的行为。您需要单独删除每个元素(假设删除它们是合适的)。
一个更好的解决方案是使用容器类(例如std::vector
或std::array
),它会自动为您处理清理。如果你还没有准备好使用现有的解决方案,那么你需要阅读"三条规则"。
由于您尚未为child
数组分配动态内存,因此不应使用delete[]
运算符来释放它。但是,您可以为该数组的每个单独元素delete
来释放每个单独的子octree
。然后,这将调用每个子级的析构函数。
需要记住的一个好规则是,每个new
必须有一个匹配的delete
(反之亦然)。并且每个new[]
必须具有匹配的delete[]
(反之亦然)。
您所声明的是一个由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
实例时,它的析构函数将被调用。
实际上,析构函数只会删除数组,而不会删除子八叉树对象。您必须显式删除它们(当然,在删除数组之前)。