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 ) );
Где по существу размер массива должен быть передан в объект удаления вручную. Есть лучший способ сделать это? Это кажется довольно подверженным ошибкам ...