std :: unique_ptr <T []> y eliminador de asignador personalizado
Estoy tratando de usarstd::unique_ptr<T[]>
con asignadores de memoria personalizados. Básicamente, tengo asignadores personalizados que son subclases deIAllocator
, que proporciona los siguientes métodos:
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 )
Como la memoria subyacente puede provenir de un bloque preasignado, necesito el especial...Array()
-métodos para asignar y liberar matrices, asignan / liberan memoria y llamanT()
/ ~T()
en cada elemento en el rango. Ahora, que yo sepa, eliminadores personalizados parastd::unique_ptr
usa la firma:
void operator()(T* ptr) const
En el caso deunique_ptr<T[]>
normalmente llamaríasdelete[]
y terminar con eso, pero tengo que llamarFreeArray<T>
, para lo cual necesito el número de elementos en el rango. Dado solo el puntero en bruto, creo que no hay forma de obtener el tamaño del rango, por lo tanto, lo único que se me ocurre es esto:
std::unique_ptr<T[], MyArrDeleter> somePtr( allocator.AllocArray<T>( 20 ), MyArrDeleter( allocator, 20 ) );
Donde esencialmente el tamaño de la matriz debe pasarse al objeto eliminador manualmente. ¿Hay una mejor manera de hacer esto? Esto me parece bastante propenso a errores ...