std :: unique_ptr <T []> и пользовательский распределитель удаления

Я пытаюсь использоватьstd::unique_ptr<T[]> с пользовательскими распределителями памяти. В основном, у меня есть пользовательские распределители, которые являются подклассамиIAllocator, который предоставляет следующие методы:

void* Alloc( size_t size )
template<typename T> T* AllocArray( size_t count )
void Free( void* mem )
template<typename T> void FreeArray( T* arr, size_t count )

Поскольку базовая память может исходить из предварительно выделенного блока, мне нужны специальные...Array()-методы для выделения и освобождения массивов, они выделяют / освобождают память и вызываютT() / ~T() на каждом элементе в диапазоне. Теперь, насколько я знаю, кастомные удалители дляstd::unique_ptr используйте подпись:

void operator()(T* ptr) const

В случаеunique_ptr<T[]>обычно звонилdelete[] и покончим с этим, но я должен позвонитьFreeArray<T>, для которого мне нужно количество элементов в ассортименте. Учитывая только необработанный указатель, я думаю, что нет никакого способа получить размер диапазона, поэтому единственное, что я мог придумать, это:

std::unique_ptr<T[], MyArrDeleter> somePtr( allocator.AllocArray<T>( 20 ), MyArrDeleter( allocator, 20 ) );

Где по существу размер массива должен быть передан в объект удаления вручную. Есть лучший способ сделать это? Это кажется довольно подверженным ошибкам ...

Ответы на вопрос(1)

Ваш ответ на вопрос