Следующий код, скомпилированный с MSVC9.0, запускается и выводит Destructor четыре раза, что логично.
#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 не приводятв неопределенном поведении (хотя и не совсем уверен насчет delete this;
).Я хотел бы получить подтверждение или <заполнитель для антонима подтверждения> этого.Но у меня есть серьезные сомнения по поводу строк 5 и 6. Разрешается явно вызывать деструктор, не так ли?Но считается ли срок службы объекта законченным после этого?То есть разрешен ли (вызван) вызов другого члена после явного вызова деструктора?
Подводя итог, какие части приведенного выше кода (если таковые имеются) приводят к неопределенному поведению (технически говоря)?