Исходя из ваших требований, я думаю, вам придется использовать размещение new
. Поскольку вы не предоставили весь соответствующий код, я собираюсь сделать то, что могу.
Во-первых, вам придется выделять необработанную память вместо непосредственного использования new
.
Container() : arraySize(10) { valueWrappers = reinterpret_cast<Type*>(::operator new(sizeof(Type) * arraySize)); }
Теперь, когда вы положили что-то в ваш Container
, вам придется сконструировать его на месте, используя что-то вроде следующего:
new (valueWrappers + index) Type(arguments to type);
В вашем деструкторе вам понадобится чтобы явно вызывать деструкторы для любого объекта, для которого вы использовали размещение new
.
valueWrappers[index]->~Type();
Наконец, освободите память, используя ::operator delete
.
::operator delete(valueWrappers);
Пожалуйста, имейте в виду, что это очень быстрый и грязный ответ, и этот код может быть трудно отладить и поддерживать. Вам нужно будет отслеживать, какие индексы в valueWrapper
были инициализированы, а какие нет во время очистки. Если возможно, я очень рекомендую использовать что-то похожее на std::vector
, которое справится со всей этой сложностью для вас.