正在调用八叉树数组上的delete

Invoking delete on an octree array

本文关键字:delete 数组 八叉树 调用      更新时间:2023-10-16

所以我写了一个八叉树结构,如下所示:

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::vectorstd::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实例时,它的析构函数将被调用。

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