Это более интересная проблема, чем вы думаете на первый взгляд. Этот ответ об одной возможной реализации.
Во-первых, хотя на каком-то уровне ваша система должна знать, как «освободить» блок памяти, лежащий в основе malloc / free (который обычно вызывают new / delete / new [] / delete []) не всегда точно запоминает сколько памяти вы запрашиваете, она может быть округлена (например, когда вы выше 4K, она часто округляется до следующего блока размером 4K).
Следовательно, даже если бы можно было получить размер блока памяти, это не говорит нам, сколько значений находится в новой памяти [], так как она может быть меньше. Поэтому нам нужно хранить дополнительное целое число, сообщающее нам, сколько существует значений.
КРОМЕ, если конструируемый тип не имеет деструктора, тогда delete [] не должен делать ничего, кроме освобождения блока памяти, и, следовательно, не должен ничего хранить!