- Имеет ли следующий код определенное поведение?
- Если нет, то какая часть кода UB и какие разделы стандартного состояния UB?
- Если этот код UB, есть ли [незначительные] изменения, которые могут его исправить?
- Если ничего не исправить, какую другую схему/шаблон кода можно использовать для реализации той же функции?
class C
{
public:
virtual ~C() {}
virtual void switch_me() = 0;
};
class C1 : public C
{
public:
C1() : b(true) { std::cout << "C1\n"; }
~C1() { std::cout << "~C1\n"; }
private:
void switch_me();
bool b;
};
class C2 : public C
{
public:
C2() : i(1) { std::cout << "C2\n"; }
~C2() { std::cout << "~C2\n"; }
private:
void switch_me();
int i;
};
void C1::switch_me()
{
this->~C1(); // lifetime of *this ends here
std::cout << "blih\n"; // execute some code that does
// not attempt to access object
new(this) C2(); // create a C2 instance in-place
}
void C2::switch_me()
{
this->~C2(); // lifetime of *this ends here
std::cout << "blah\n"; // execute some code...
new(this) C1(); // create a C1 instance in-place
}
class Cnt
{
public:
Cnt() { new(&storage) C1(); }
~Cnt() { (*this)->~C(); }
C* operator->() { return reinterpret_cast<C*>(&storage); }
private:
char storage[std::max(sizeof(C1),sizeof(C2))];
};
int main()
{
Cnt c;
c->switch_me();
c->switch_me();
return 0;
}
Код для 'switch_me' is **** <- Вставьте здесь эксплойт. Зачем ты это делаешь? –
@ πάντα ῥεῖ: определенно не дубликат! в моем вопросе функция-член вызывает его DESTRUCTOR СОБСТВЕННОГО КЛАССА (т. е. это саморазрушение). – shrike
@shrike Я не вижу принципиальной разницы. Прочитайте оба ответа. Об этом даже упоминается саморазрушение мест размещения «новых» экземпляров. –