Il seguente codice compilato con MSVC9.0 esegue e produce Destructor quattro volte, il che è logico.Suicidio orientato agli oggetti o cancellarlo;
#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();
}
penso che le prime 4 righe di codice in principale non portano a comportamento non definito (anche se non del tutto sicuro della delete this;
cosa). Vorrei avere una conferma o < segnaposto per l'antonio di conferma> di quello. Ma ho seri dubbi sulle linee 5 e 6. È permesso chiamare esplicitamente il distruttore, non è vero? Ma la vita dell'oggetto considerato è terminata dopo? Cioè, l'invocazione di un altro membro dopo la chiamata esplicita del distruttore è consentita (definita)?
Per riassumere, quali parti del codice precedente (se presenti) comportano un comportamento non definito (tecnicamente parlando)?
Ma il costruttore viene chiamato solo 3 volte, quindi come si chiama il distruttore 4 volte logico? Bombarderebbe non appena la classe riceve (non banali) membri dei dati. – visitor