Объектно-ориентированное самоубийство или удалите это;

Следующий код, скомпилированный с помощью MSVC9.0, запускается и выводит Деструктор четыре раза, что логично.

#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();
}

Я думаю, что первые 4 строки кода в main не приводят к неопределенному поведению (хотя не совсем уверен насчет удалить это; ). Я хотел бы получить подтверждение или <заполнитель для антонима подтверждения> этого. Но у меня есть серьезные сомнения насчет строк 5 и 6. Разрешено явно вызывать деструктор, не так ли? Но считается ли после этого время жизни объекта завершенным? То есть разрешен (определен) вызов другого члена после явного вызова деструктора?

Подводя итог, какие части приведенного выше кода (если таковые имеются) приводят к неопределенному поведению (технически говоря)?

10
задан Brian Tompsett - 汤莱恩 11 July 2015 в 09:43
поделиться