Kann benutzerdefinierten Zuordner mit allocate_shared / make_shared nicht verwenden

8

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:

%Vor%

Hier habe ich einen sehr einfachen Stub-Allokator und einen Aufruf an allocate_shared . Der Fehler, den GCC produziert, ist:

%Vor%

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?

    
yeputons 18.03.2014, 17:55
quelle

2 Antworten

12

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.

    
Brandon 18.03.2014, 18:07
quelle
11

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%     
Jonathan Wakely 18.03.2014 18:01
quelle