std :: unique_ptr <T []> e deletador de alocador personalizado
Estou tentando usarstd::unique_ptr<T[]>
com alocadores de memória personalizados. Basicamente, tenho alocadores personalizados que são subclasses deIAllocator
, que fornece os seguintes 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 a memória subjacente pode vir de um bloco pré-alocado, eu preciso do...Array()
-métodos para alocar e liberar matrizes, eles alocam / liberam memória e chamamT()
/ ~T()
em todos os elementos do intervalo. Agora, tanto quanto eu sei, deleters personalizados parastd::unique_ptr
use a assinatura:
void operator()(T* ptr) const
No caso deunique_ptr<T[]>
normalmente você chamariadelete[]
e acabar com isso, mas eu tenho que ligarFreeArray<T>
, para o qual preciso do número de elementos no intervalo. Dado apenas o ponteiro bruto, acho que não há como obter o tamanho do intervalo, portanto, a única coisa que eu poderia fazer é:
std::unique_ptr<T[], MyArrDeleter> somePtr( allocator.AllocArray<T>( 20 ), MyArrDeleter( allocator, 20 ) );
Onde essencialmente o tamanho da matriz deve ser passado para o objeto deleter manualmente. Existe uma maneira melhor de fazer isso? Isso me parece bastante propenso a erros ...