Nein, wegen Arrays und Details. Sicher, weil diese Probleme in Ihrer Codebasis wahrscheinlich keine Rolle spielen.
Alle Löschungen sind entweder typspezifische Löschungen oder:
Das Verhalten der Standardbibliothek Implementierung dieser Funktion ist nicht definiert, es sei denn ptr ein Nullzeiger oder ein Zeiger ist bereits aus der Standardbibliothek Implementierung erhalten von operator new (size_t) oder operator new (size_t, std :: nothrow_t).
von http://en.cppreference.com/w/cpp/memory/new/operator_delete
Dies bedeutet Speicher durch new[](size_t)
zu delete(void*)
zugeordnet vorbei ist UB und new[](size_t)
zu delete[](void*)
UB ist.
Zweitens sind Benutzer frei, neue/löschen auf einer globalen oder pro Klasse zu ersetzen.
Drittens:
void delete_procedure(Object* obj){
obj->~Object();
::operator delete((void*)obj);
}
Sie werfen wollen werden Zeiger dort für ungültig zu erklären und verwenden Betreiber löschen.
Forth, der Zeiger auf delete_procedure
geben muss der Zeiger durch new T
oder ::new(::new(sizeof(T))) T
erzeugt werden kann; Es kann kein Zeiger auf ein Unterobjekt abgeleitet sein, da sein Wert void*
abweichen kann.
Wenn T* pt
dynamisch gießbar ist, wird dynamic_cast<void*>(pt)
das void*
rekonstruieren. Das ist also weniger eine Barriere als es scheint. Denken Sie daran, die Besetzung zu tun, bevor Sie das Objekt zerstören!
void delete_procedure_dynamic(Object* obj){
void* ptr=dynamic_cast<void*>(obj);
obj->~Object();
::operator delete(ptr);
}
und SFINAE/Tag-Dispatching verwenden, um zwischen den dynamischen und nicht dynamischen Versionen zu versenden.
Fünftens müssen hohe Ausrichtungstypen Arbeit verarbeiten. Sie verwenden verschiedene neue und löschen. Ich bin unsicher, wie dynamische Casting und überabgerichtete abgeleitete Typen interagieren würden, aber wahrscheinlich müssen Sie sich nicht kümmern.
Aber new T
Anrufe ::new(size_t)`` then constructs an object there.
Operator löschen (void *) must be fed memory produced by
:: neu (size_t) . Destroying an object creates by
neue T is legal via
. ~ T() `. Ich sehe also nichts grundsätzlich gebrochen.
In der Praxis, was ich tun könnte, überschreiben "normal" neu, um das gleiche Muster wie Ihre zusätzlichen Speicher neu zu folgen (und den Block über new(size_t)
zuweisen), um die Dinge einfach zu halten. Sie befinden sich in einem arkanen Territorium, warum machen Sie die Dinge nicht einheitlich?
Wenn Sie sich interessieren: Warum brauche ich das? Ich schreibe einen Garbage Collector für gleichzeitige Datenstrukturen und einige Objekte, die der GC managt, können effektiv über die neue Platzierung für die Effizienz unterschiedlich dimensioniert werden (zB Metadaten gefolgt von c String), einige Objekte sind möglicherweise nicht, und ich möchte mich nicht darauf verlassen auf den Benutzer, um den Unterschied zu verfolgen. – Joe
Eine solche Prozedur kann nicht existieren, da Sie das 'delete' mit dem entsprechenden' new' vergleichen müssen, und außerdem gibt es keinen "placement-delete expression". –
Immer Placement neu verwenden? –