Я удивлен, что Effective C ++ посоветовал бы вам использовать что-то столь же хакерское, как void*
.
new[]
делает очень специфическую вещь: он выделяет массив с динамическим размером . Массив, выделенный вместе с ним, должен быть передан в delete[]
. delete[]
затем читает скрытое число, чтобы найти, сколько элементов в массиве, и уничтожает объекты , как вы сделали с p[i].~A();
.
Однако это использование несовместимо с этим. Массив имеет статический размер, и невозможно получить это скрытое число или уничтожение в динамическом размере без правильного использования new[]
(без operator
), в свою очередь требующего конструктора по умолчанию. Подлинная слабость C ++.
Если вы позвоните delete[]
в конце main
, как и предполагали другие, ваш код может дать сбой. Вместо этого вам нужно использовать operator delete[]
, который выглядит как опечатка и является просто авария в ожидании.
Используйте не массив operator new
и operator delete
и достаточно комментариев, если вы должны использовать этот трюк. Но я не считаю это особенно эффективным C ++.