Es heißt placement new. Es ruft den Konstruktor im angegebenen Speicher auf, anstatt neuen Speicher zuzuweisen. Beachten Sie, dass Sie in diesem Fall den Destruktor Ihres Objekts explizit aufrufen müssen, bevor Sie den zugewiesenen Speicher freigeben können.
Klärung. Angenommen, Sie haben einen unformatierten Speicher
zugewiesen, und Sie möchten ein Objekt in diesem Speicher erstellen. Sie rufen
new(rawMemory) Object(params);
Nun, bevor die Speicherfreigabe
delete [] rawMemory;
Sie das derstuctor von Object explizit
reinterpret_cast<Object*>(rawMemory)->~Object();
In Ihrem speziellen Beispiel haben zu rufen, aber das potenzielle Problem ist dass Sie das vorhandene Objekt nicht ordnungsgemäß zerstört haben, bevor Sie ein neues in seinem Speicher erstellt haben.
Bonus: Haupt gewundert, wie Standard std::vector
ohne die darin enthaltenen Objekte sind default-konstruierbar tun kann? Der Grund ist, dass bei den meisten, wenn nicht allen, Implementierungen allocator<T>
keine T* p
speichert, die erfordern würden, dass T im Fall von p = new T[N]
standardmäßig konstruierbar ist. Stattdessen speichert es einen char
Zeiger - Raw-Speicher und weist p = new char[N*sizeof(T)]
zu. Wenn Sie ein Objekt push_back
aufrufen, ruft es einfach den Kopierkonstruktor mit der neuen Position an der entsprechenden Adresse in diesem char-Array auf.
Neben den vorhandenen Antworten: Die Syntax im * title * Ihrer Frage existiert nicht! Sie können diese Syntax nicht mit einem beliebigen Wert verwenden, Sie können sie einfach in einem Konstruktoraufruf verwenden - d. H. "Wert" muss die Form "T (Argumente)" haben. –
Platzierung neu immer in einem C++ - Speicherpool (Objekte Pool) verwendet. als zusätzliche Antwort. – Healer