Ich versuche, std::unique_ptr<T[]>
mit benutzerdefinierten Speicherzuordnern zu verwenden. Grundsätzlich habe ich benutzerdefinierte Zuordner, die Unterklassen von IAllocator
sind, die die folgenden Methoden bereitstellt:
Da der zugrunde liegende Speicher möglicherweise aus einem zuvor zugewiesenen Block stammt, benötige ich die speziellen ...Array()
-Methoden, um Arrays zuzuordnen und freizugeben, sie weisen Speicher zu und rufen T()
/ ~T()
für jedes Element in der Angebot.
Nun, soweit ich weiß, verwenden benutzerdefinierte Deleter für std::unique_ptr
die Signatur:
Im Fall von unique_ptr<T[]>
würden Sie normalerweise delete[]
aufrufen und damit fertig sein, aber ich muss FreeArray<T>
aufrufen, wofür ich die Anzahl der Elemente im Bereich benötige. Da ich nur den rohen Zeiger verwende, denke ich, dass es keine Möglichkeit gibt, die Größe des Bereichs zu erhalten, daher ist das einzige, was ich mir vorstellen kann, das:
Dabei muss im Wesentlichen die Größe des Arrays manuell in das Löschobjekt übergeben werden. Gibt es einen besseren Weg, dies zu tun? Das scheint mir ziemlich fehleranfällig zu sein ...
Ja, da ist sicher ein besserer Weg:
Verwenden Sie eine Maker-Funktion.
T*
enthält solche Informationen nicht, weder unique_ptr weiß über die Größe des Arrays (da es direkt ein delete []
verwendet, wie Sie angegeben haben). Sie könnten T
auf unique_ptr<T>
setzen, um die Vernichtung automatisch zu verwalten, aber dies ist nicht möglich, wenn das gesamte zusammenhängende T*
von einem Speicherzuordner verwaltet wird (und nicht von einem einzelnen T*
-Objekt). ZB:
Tags und Links c++ c++11 memory-management allocator unique-ptr