Вы не можете изменить размер выделения, сделанного с помощью new
.
Если выделение осуществляется с помощью std::malloc
(или друзей), вы в принципе можете использовать std::realloc
, чтобы сообщить системный распределитель, который вам больше не нужен во второй половине, но это невозможно для первой половины, и я бы посчитал сомнительным, будет ли какая-то польза от этого вообще.
Дополнительно std::malloc
делает не создавать объекты до C ++ 20 и, следовательно, сделать его довольно сложным для использования без неопределенного поведения. (В частности, массив не может быть вставлен в него реально.)
Решение варианта использования, упомянутого в комментариях, состоит в использовании двух указателей вместо одного в вашей структуре: один указатель указывает на начало выделение и один указатель, указывающий на начало используемого пространства. Вы оставляете первый круг вокруг, только для вызова delete[]
на нем, когда это необходимо, а другой может использоваться для указания начала фактических данных.
Точно так же вы будете держать около двух указателей до конца, один до конца выделения и от одного до конца используемой части (или двух целых чисел, обозначающих размеры обоих).