Der folgende Code kompiliert mit MSVC9.0 läuft und gibt Destructor vier Mal aus, was logisch ist.Objektorientierter Selbstmord oder löschen Sie dies;
#include <iostream>
class SomeClass
{
public:
void CommitSuicide()
{
delete this;
}
void Reincarnate()
{
this->~SomeClass();
new (this) SomeClass;
}
~SomeClass()
{
std::cout << "Destructor\n";
}
};
int main()
{
SomeClass* p = new SomeClass;
p->CommitSuicide();
p = new SomeClass;
p->Reincarnate();
p->~SomeClass(); //line 5
p->CommitSuicide();
}
Ich denke, die ersten 4 Zeilen Code in Haupt in undefiniertem Verhalten führen nicht (wenn auch nicht ganz sicher über die delete this;
Sache). Ich möchte eine Bestätigung oder < Platzhalter für die Bestätigung der Antonym> davon haben. Aber ich habe ernsthafte Zweifel an den Zeilen 5 und 6. Es ist erlaubt, den Destruktor explizit aufzurufen, oder? Aber gilt die Lebensdauer des Objekts danach als beendet? Das heißt, ist der Aufruf eines anderen Mitglieds nach dem expliziten Aufruf des Destruktors erlaubt (definiert)?
Zusammenfassend, welche Teile des obigen Codes (wenn überhaupt) zu undefiniertem Verhalten (technisch gesprochen) führen?
Aber der Konstruktor wird nur 3 mal aufgerufen, also wie ist der Destruktor 4 mal logisch? Es würde bombardieren, sobald die Klasse (nicht-triviale) Datenmitglieder bekommt. – visitor