所以我写了一个八叉树结构,如下:
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;}
};
我所关心的是析构函数......
它会叫孩子们的破坏者,还是我自己必须这样做?
答案 0 :(得分:1)
不,这完全被打破了。在数组上调用delete
会导致未定义的行为。您需要单独删除每个元素(假设它们适合删除它们)。
更好的解决方案是使用容器类(例如std::vector
或std::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
实例时,将调用其析构函数。