El siguiente código compilado con MSVC9.0 se ejecuta y genera Destructor cuatro veces, lo cual es lógico.Suicidio orientado a objetos o eliminar esto;
#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();
}
creo que las primeras 4 líneas de código, en el principal no dan como resultado un comportamiento indefinido (aunque no del todo seguro de lo delete this;
). Me gustaría tener una confirmación 0 < marcador de posición para el antónimo de confirmación> de eso. Pero tengo serias dudas sobre las líneas 5 y 6. Se permite llamar explícitamente al destructor, ¿no es así? Pero, ¿se considera que la vida útil del objeto finalizó después de eso? Es decir, ¿la invocación de otro miembro después de la llamada explícita del destructor está permitida (definida)?
En resumen, ¿qué partes del código anterior (si corresponde) dan como resultado un comportamiento indefinido (técnicamente hablando)?
Pero el constructor solo se llama 3 veces, entonces, ¿cómo se llama lógico al destructor 4 veces? Sería una bomba tan pronto como la clase obtenga miembros de datos (no triviales). – visitor