Aufruf Destruktor und dann der Konstruktor (zurücksetzen ein Objekt)

Ich zurücksetzen möchten ein Objekt. Kann ich es in der folgenden Art und Weise?

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

Dieser code ist offensichtlich eine Teilmenge der typische Lebenszyklus eines Objekts zugewiesen, durch die Platzierung neuer:

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

Die einzige Sache, die geändert wird, ist die Reihenfolge der Konstruktor-und Destruktor-Aufrufe.

So, warum in der folgende FAQ
alle, die bedrohlich erscheinen?

[11.9] Aber kann ich explizit aufrufen, ein
Destruktor, wenn ich mein Objekt zugeordnet
mit neuen?

FAQ: kann Man nicht, es sei denn, das Objekt wurde
zugeordnet mit placement-new. Objekte
erstellt durch neue gelöscht werden müssen, die
zwei Dinge tut (an Sie erinnern): Anrufe
der Destruktor, dann befreit den Speicher.

FQA: Übersetzung: löschen ist ein Weg, um
ausdrücklich rufen Sie einen Destruktor, aber es
auch plant den Speicher. Sie können
auch ein Destruktor ohne
freigeben von Speicher. Es ist hässlich und
nutzlos in den meisten Fällen, aber Sie tun können
.

Destruktor/Konstruktor-Aufruf ist offensichtlich normalen C++ - code. Garantien im code verwendet direkt das Ergebnis aus der Platzierung der neuen Garantien. Es ist der Kern des standard -, es ist rock solid Sache. Wie kann es sein, genannt "dirty" und präsentiert als etwas unzuverlässig?

Glaubst du, es ist möglich, dass die in der Platzierung und nicht-in-placement-Umsetzung der neuen sind anders? Ich denke über einige Kranken die Möglichkeit, dass regelmäßig neue kann z.B. die Größe der Speicherblock vor dem block, welche Platzierung neuen natürlich nicht tun würde (da es nicht keinen Speicher zuweisen). Dies könnte dazu führen, eine Lücke für einige Probleme... Ist wie neu() Umsetzung möglich?

Die Menschen werden Euch sagen, dass können Sie nicht, rufen Sie den Konstruktor. Ehrlich gesagt, ich habe nie gesehen, dass ein Konstruktor aufgerufen, wie in anObject->AnObject();, aber ich weiß nicht, die standard-auswendig-und habe nicht sah es so einrichten, dass ich kann bestätigen, dass es verboten ist. Allerdings, wenn Sie sind so sicher, dass es ist der Kern des standard - und fels, warum Fragen Sie? Wenn Sie sicher sind, es bedeutet, dass Sie getestet haben, Ihren code und es funktioniert, also, wenn Sie mögen diese Lösung, nur mit ihm zu gehen.
Ich möchte überprüfen, dass ich nichts verpasse, wie der Letzte edit in der Frage.

InformationsquelleAutor | 2009-07-14

Schreibe einen Kommentar