In meinem C ++ 11-Programm verwende ich shared_ptr<T>
für einige Objekte, die aktiv erstellt und gelöscht werden. Es ist also passiert, dass der Standard-Allokator mit operator new
ein Flaschenhals ist, also möchte ich einen eigenen erstellen, der eine Menge Speicher auf einmal zuweist und dann auf Wunsch make_shared
gibt. Leider schreibe ich zum ersten Mal einen Allokator und ich habe keine Ahnung, warum GCC den folgenden Code nicht kompilieren kann:
Hier habe ich einen sehr einfachen Stub-Allokator und einen Aufruf an allocate_shared
. Der Fehler, den GCC produziert, ist:
Warum passiert das? Wie schreibe ich Zuweiser korrekt, so dass sie mit allocate_shared
arbeiten? Ich weiß, dass es noch einige andere Operatoren und Typeigenschaften gibt, die vom Allokator unterstützt werden sollen, aber ich sehe keinen Hinweis darauf, was GCC von mir will.
Ist es auch OK, char
als value_type
für diesen bestimmten Zuordner zu verwenden (in Verbindung mit shared_ptr
) oder etwas wie void
oder shared_ptr<T>::some_weird_stuff
ist vorzuziehen?
So ... Sie benötigen es templated, Sie brauchen die Rebind und die Typen und die Zuweisung und Freigabe von Mitgliedern. Es ist auch schön, die Betreiber zu haben ..
%Vor%Am allerwenigsten könnte ein Zuordner wie folgt aussehen:
%Vor% Dies funktioniert auch für allocate_shared
. Da ich aber der Typ bin, der ich bin, bevorzuge ich alle Funktionen. Sogar diejenigen, die nicht von diesem Container / dieser Funktion benötigt / verwendet werden.
Ihr benutzerdefinierter Zuordner erfüllt nicht die C ++ - Zuordnungsanforderungen.
Insbesondere unterstützt es nicht die Rückbindung, um Objekte eines anderen Typs zuzuweisen. Üblicherweise sind Allokatoren Schablonen, die auf den Typ parametriert sind, für den sie Speicher reservieren. allocate_shared
muss den Zuordner erneut binden, damit er einen Speicherblock mit der entsprechenden Größe und dem richtigen Typ zuweisen kann. Es soll kein Array von Zeichenobjekten zugeordnet werden.
%Vor%
Dies ist keine korrekte Annahme. Instanziieren von allocator_traits<MyAlloc>
instanziiert nicht alle seine Mitglieder.
Ist es auch OK, char als value_type für diesen bestimmten Zuordner zu verwenden?
Das macht Ihren Allokator zu einem Allokator von char
, aber allocate_shared
benötigt einen Allokator von some_internal_type_defined_by_the_library
und versucht daher std::allocator_traits<MyAlloc>::rebind_alloc<some_internal_type_defined_by_the_library>
zu verwenden, um einen Allokator für diesen Typ zu erhalten, aber Ihr Allokator unterstützt die Rebind nicht Anforderung.
Wenn Ihr Allokator eine Vorlage der Form MyAlloc<T>
ist, kann allocator_traits
bestimmen, wie er an MyAlloc<U>
erneut gebunden wird, andernfalls muss der Typ MyAlloc::rebind<U>::other
gültig sein.
Der C ++ - Standard zeigt das folgende Beispiel für einen Zuordner, der die Mindestanforderungen für einen C ++ - Zuordnertyp unterstützt:
%Vor%Tags und Links c++ c++11 memory-management allocator shared-ptr