std :: unique_ptr <T []> und benutzerdefiniertes Allokator-Deleter
Ich versuche, @ zu verwendstd::unique_ptr<T[]>
mit benutzerdefinierten Speicherzuordnungen. Grundsätzlich habe ich benutzerdefinierte Allokatoren, die Unterklassen von @ siIAllocator
, das die folgenden Methoden bereitstellt:
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 )
Da der zugrunde liegende Speicher möglicherweise aus einem vorab zugewiesenen Block stammt, benötige ich das spezielle...Array()
-Methoden zum Zuweisen und Freigeben von Arrays, zum Zuweisen / Freigeben von Speicher und zum Aufrufen vonT()
/ ~T()
für jedes Element im Bereich. Nun, soweit ich weiß, benutzerdefinierte Deleter fürstd::unique_ptr
benutze die Signatur:
void operator()(T* ptr) const
Im Falle desunique_ptr<T[]>
, normalerweise würden Sie @ anrufdelete[]
und fertig, aber ich muss @ anrufFreeArray<T>
, wofür ich die Anzahl der Elemente im Bereich benötige. Wenn ich nur den rohen Zeiger betrachte, gibt es meines Erachtens keine Möglichkeit, die Größe des Bereichs zu ermitteln. Daher kann ich mir nur Folgendes einfallen lassen:
std::unique_ptr<T[], MyArrDeleter> somePtr( allocator.AllocArray<T>( 20 ), MyArrDeleter( allocator, 20 ) );
Wo im Wesentlichen die Größe des Arrays manuell in das Deleter-Objekt übergeben werden muss. Gibt es einen besseren Weg, dies zu tun? Das scheint mir ziemlich fehleranfällig ...