Wie verwenden von std::allocator in meiner eigenen container-Klasse
Ich bin versucht zu schreiben, eine container-Klasse, die verwendet STL-allocators. Was ich momentan mache, ist ein private member
std::allocator<T> alloc_;
(dieses wird später Vorlagen, so dass der Benutzer kann wählen Sie eine andere Zuweisung) und rufen Sie dann
T* ptr = alloc_.allocate(1,0);
einen Zeiger auf eine neu zugewiesene 'T' - Objekt (und verwendet alloc_.Konstrukt zum Aufruf des Konstruktors; siehe Antwort unten). Das funktioniert mit dem GNU-C++ - Bibliothek.
Jedoch mit STLPort unter Solaris, dies fehlschlägt, das richtige zu tun und führt zu allen möglichen bizarren Speicher Korruption Fehler. Wenn ich stattdessen tun
std::allocator_interface<std::allocator<T> > alloc_;
dann ist es alles so funktioniert wie es sollte.
Was ist der richtige Weg für die Verwendung der stl::allocator? Die STLPort - /Solaris-version nicht kompiliert mit g++, aber g++ richtig?
- Es gibt nichts genannt
allocator_interface
in der standard-Bibliothek.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas, was Sie tun möchten, ist Ihr eigener
allocator
, die Sie verwenden können, um zu sehen, wie die standard-Container interagieren wit-allocators. Stephan T. Lavavej geschrieben, eine nette, einfache nannte man diemallocator
. Legen Sie es in ein test-Programm, das verwendet verschiedenen STL-Container und Sie können leicht sehen, wie die Zuweisung wird von der standard-Container:Nicht alle interface-Funktionen in der
mallocator
(wieconstruct()
unddestroy()
) versehen sind, mit trace-output, so möchten Sie vielleicht, um die drop-trace-Anweisungen in der es leichter macht zu sehen, wie die standard-Containern könnte, verwenden Sie diese Funktionen, ohne auf einen debugger.Dass sollte Ihnen eine gute Vorstellung davon, wie Ihre Container erwartet werden kann, um eine benutzerdefinierte
allocator
.construct
was ist die Funktion war er andernfalls zu verwenden :-/mallocator
als ein einfaches Beispiel eines benutzerdefinierten Zuweisung. Ich wurde vorgeschlagen, dass es könnte auch verwendet werden, als eine einfache Möglichkeit, zu gewinnen Einblick in, wie Container allocators, aber es müssen möglicherweise einige kleinere änderungen zur Verbesserung der Ablaufverfolgung für diesen Zweck.Müssen Sie beide zuordnen und konstruieren mit der Zuweisung. So etwas wie dieses:
Viele Dinge sind regelrecht gebrochen, wenn Sie nicht mit einer richtig konstruierten Objekt. Stellen Sie sich eine
std::string
zugeordnet werden können, aber nicht gebaut. Wenn Sie versuchen, zuweisen zu können, wird es zuerst versuchen, die Bereinigung seiner alten Inhalte durch die Freigabe einige Daten, die selbstverständlich sein Müll-Werte vom heap und Absturz.std::allocator<T>::construct
dann ist es gebrochen, nicht die Mühe, auch mit es. Ich kann Ihnen mit Sicherheit sagen, dass 5.1.5 (die version, die ich installiert haben, haben tut es und gut funktioniert).std::allocator
. In 4,6, dasconstruct
Funktion gibt es auf der Linie 365 vonstlport/stl/_alloc.h
. Wenn es nicht funktioniert, deine Installation ist nicht korrekt.