Поэтому я написал структуру 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;}
};
Я беспокоюсь о деструкторе …
Будут ли они вызывать деструкторов у детей или мне придется делать это самому?
То, что вы объявили, это массив из 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
Например, его деструктор будет называться.
Нет, это полностью сломано. призвание delete
в массиве приводит к неопределенному поведению. Вам нужно будет удалить каждый элемент по отдельности (при условии, что их следует удалить).
Гораздо лучшим решением является использование класса контейнера (например, std::vector
или же std::array
), которая автоматически занимается очисткой для вас. Если вы не готовы использовать существующее решение, вам нужно прочитать о Правило трех.
Поскольку вы не выделили динамическую память для child
массив, вы не должны использовать delete[]
оператор, чтобы освободить его. Однако вы можете delete
каждый отдельный элемент этого массива, чтобы освободить каждого отдельного ребенка octree
, Это будет вызывать деструкторы каждого из детей.
Хорошее правило помнить, что каждый new
должен иметь соответствующий delete
(и наоборот). И каждый new[]
должен иметь соответствующий delete[]
(и наоборот).
Как таковой, деструктор будет удалять только массив, но не дочерние объекты октодерева. Вы должны удалить их явно (перед удалением массива, конечно).