Размещение delete
не имеет особого смысла, поскольку деструктор уже делает то, что должен делать размещение delete
.
Обычный delete
вызывает деструктор и затем освобождает память, котораябыл выделен для объекта с new
.Однако, в отличие от обычного new
, размещение new
не выделяет память, а только инициализирует ее.Следовательно, размещение delete
должно вызвать только деструктор объекта, который будет «удален».
Все, что вам нужно, это вызвать деструктор каждого объекта массива напрямую:
~DynArray() {
for (int i = 0; i < size; i++)
data[i].~T();
}
Начиная с C ++ 17 вы также можете использовать шаблон функции std::destroy
вместо прямого вызова деструктора:
~DynArray() {
auto first = std::addressof(data[0]);
auto last = std::next(first, size);
std::destroy(first, last);
}