Suicídio Orientado a Objetos ou exclua-o;
O código a seguir compilado com MSVC9.0 é executado e saiDestruidor quatro vezes, o que é lógico.
#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();
}
Eu acho que as 4 primeiras linhas de código em main não resultam em comportamento indefinido (embora não tenha muita certeza sobre odelete this;
coisa). Eu gostaria de ter uma confirmação ou<espaço reservado para antônimo de confirmação> por essa. Mas tenho sérias dúvidas sobre as linhas 5 e 6. É permitido chamar explicitamente o destruidor, não é? Mas é considerado que a vida útil do objeto terminou depois disso? Ou seja, é permitida (definida) a chamada de outro membro após a chamada explícita do destruidor?
Para resumir, quais partes do código acima (se houver) resultam em comportamento indefinido (tecnicamente falando)?