正在调用八叉树数组上的delete
Invoking delete on an octree array
所以我写了一个八叉树结构,如下所示:
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
实例时,它的析构函数将被调用。
实际上,析构函数只会删除数组,而不会删除子八叉树对象。您必须显式删除它们(当然,在删除数组之前)。
相关文章:
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 调用delete[]时,某些东西导致堆损坏,但我已正确设置了数组的维度
- 在复制 delete[] 数组后在 C++ 中检测到堆损坏
- 使用delete []删除在堆内存上创建的一系列数组
- 有没有办法拥有一个未初始化的类数组,这些类在调用 delete[] 时不会被破坏?
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- 如何通过将特定的字符组合移动到空数组来"delete"单词和元音?
- 在对象的动态数组上调用 delete [] 不会释放内存?
- Delete[]数组中断了我的C++程序
- C++ 是否可以从数组中'delete'元素?
- 如何"delete"数组的一部分并保留其余部分而不运行它?
- C++ 使用 delete[] 删除新数组
- delete[] 运算符的参数可以指向数组的非第一个元素吗?
- 如果将 delete[] 应用于非数组指针会发生什么情况
- 在给定的 c++ 代码中"delete [] element"以实现一维数组的目的是什么?
- 在接收动态数组或堆对象时,我应该使用 delete 还是 delete[]
- 使用delete[]为一维常量的2d数组解除内存分配
- 重载数组中的new和delete
- std::unique_ptr<T[]> 使用派生对象数组,使用 delete 函数
- c++ delete数组崩溃