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)?

questionAnswers(3)

yourAnswerToTheQuestion