Вызов delete для массива октодерева

Поэтому я написал структуру 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;}
};

Я беспокоюсь о деструкторе …
Будут ли они вызывать деструкторов у детей или мне придется делать это самому?

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 Например, его деструктор будет называться.

0

Другие решения

Нет, это полностью сломано. призвание delete в массиве приводит к неопределенному поведению. Вам нужно будет удалить каждый элемент по отдельности (при условии, что их следует удалить).

Гораздо лучшим решением является использование класса контейнера (например, std::vector или же std::array), которая автоматически занимается очисткой для вас. Если вы не готовы использовать существующее решение, вам нужно прочитать о Правило трех.

1

Поскольку вы не выделили динамическую память для child массив, вы не должны использовать delete[] оператор, чтобы освободить его. Однако вы можете delete каждый отдельный элемент этого массива, чтобы освободить каждого отдельного ребенка octree, Это будет вызывать деструкторы каждого из детей.

Хорошее правило помнить, что каждый new должен иметь соответствующий delete (и наоборот). И каждый new[] должен иметь соответствующий delete[] (и наоборот).

1

Как таковой, деструктор будет удалять только массив, но не дочерние объекты октодерева. Вы должны удалить их явно (перед удалением массива, конечно).

0
По вопросам рекламы [email protected]