Ich versuche, meine eigene Allocator
zu schreiben, die in STL verwendet werden kann. So weit kann ich fast erfolgreich beenden, aber mit einer Funktion habe ich mein Problem:Synonym-Funktionsaufruf für :: new ((void *) p) T (Wert);
Die Allocator
in STL verwendet wird, soll die Funktion construct
[Beispiel aus einem Standard-Allocator new
& mit delete
] bieten:
// initialize elements of allocated storage p with value value
void construct (T* p, const T& value)
{
::new((void*)p)T(value);
}
I Ich stecke fest, wie ich dies mit meiner eigenen Funktion umschreiben kann, die das Schlüsselwort new
ersetzt und es mit value
initialisiert.
Diese Funktion construct
zum Beispiel ist in diesem Code verwendet: fileLines.push_back(fileLine);
wo
MyVector<MyString> fileLines;
MyString fileLine;
mein Dies sind typedefs
, wo ich meine eigene Allocator
verwenden:
template <typename T> using MyVector = std::vector<T, Allocator<T>>;
using MyString = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
Ich bin verwirrt, weil hier wird zB pointer
bis T
zugeteilt [wenn ich es richtig verstanden habe] MySstring
.
Habe ich es richtig verstehe, dass der Zeiger - zugeteilt durch new
-10 Bytes haben wird, wenn value
123456789
ist, und dann wird die bereitgestellte value
auf den neuen Zeiger kopiert?
Meine Frage:
Wie die eine Zeile Code mit meiner eigenen Funktion neu zu schreiben? Für mich die schwierig Punkt ist, wie man die Länge von value
[die jede Art haben kann] in Reihenfolge kann ich die Länge des zugewiesenen Blockes und wie man kopieren es in der Reihenfolge funktioniert es für alle möglichen Typen T
?
Dies ist für die meisten Leute zunächst ziemlich verwirrend. In diesem speziellen Kontext bedeutet "Platzierung neu" eigentlich "Aufruf eines Klassenkonstruktors": C++ fehlt eine dedizierte Syntax zum Aufrufen eines Konstruktors auf einer Speicheradresse (anders als beim Aufrufen eines * Destruktors *, der eine dedizierte Syntax hat , über 'p-> ~ T()'). Die Standard-Überladung von Placement new bewirkt jedoch genau das. –