Destruktor und dann Konstruktor aufrufen (ein Objekt zurücksetzen)

Ich möchte ein Objekt zurücksetzen. Kann ich das wie folgt machen?

anObject->~AnObject();
anObject = new(anObject) AnObject();
// edit: this is not allowed: anObject->AnObject();

Dieser Code ist offensichtlich eine Teilmenge des typischen Lebenszyklus eines Objekts, das von in placement new zugewiesen wurde:

AnObject* anObject = malloc(sizeof(AnObject));
anObject = new (anObject) AnObject(); // My step 2.
// ...
anObject->~AnObject(); // My step 1.
free(anObject)
// EDIT: The fact I used malloc instead of new doesn't carry any meaning

Das einzige, was sich geändert hat, ist die Reihenfolge der Konstruktor- und Destruktoraufrufe.

Also, warum in derfolgende FAQall die drohenden erscheinen?

[11.9] Kann ich aber explizit einen Destruktor aufrufen, wenn ich meinem Objekt new zugewiesen habe?

FAQ: Das können Sie nicht, es sei denn, das Objekt wurde mit Platzierung neu zugeordnet. Objekte, die von new erstellt wurden, müssen gelöscht werden. Dies hat zwei Funktionen (merken Sie sich diese): Ruft den Destruktor auf und gibt dann den Speicher frei.

FQA: Translation: delete ist eine Möglichkeit, einen Destruktor explizit aufzurufen, löst jedoch auch die Speicherzuweisung. Sie können auch einen Destruktor aufrufen, ohne die Zuordnung des Speichers aufzuheben. Es ist in den meisten Fällen hässlich und nutzlos, aber Sie können das tun.

Der Destruktor / Konstruktor-Aufruf ist offensichtlich normaler C ++ - Code. Garantien, die im Code verwendet werden, ergeben sich direkt aus den eingegangenen neuen Garantien. Es istder Kern des Standards, es ist eine felsenfeste Sache. Wie kann es "schmutzig" genannt und als etwas Unzuverlässiges dargestellt werden?

Halten Sie es für möglich, dass die In-Placement- und Non-In-Placement-Implementierung von Neuem unterschiedlich ist? Ich denke über eine kranke Möglichkeit nach, dass der reguläre neue Speicher beispielsweise die Größe des zugewiesenen Speicherblocks vor den Block setzen kann, was das Einfügen neuer Speicher offensichtlich nicht tun würde (weil er keinen Speicher zuweist). Dies könnte zu einer Lücke für einige Probleme führen ...Ist eine solche neue () Implementierung möglich?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage