Вызов деструктора вручную - совершенно правильная вещь, независимо от того, виртуален ли он.Вы просто хотите убедиться, что он вызывается один раз для каждого вызова конструктора.
Is it undefined behaviour to use the object after such a destructor call?
Да.
What if one immediatly reinitializes it with a new (this) MyClass(); call?
Все еще ужасно неопределен.
Не уничтожать вручнуюобъект, если вам не пришлось вручную его размещать, например, с помощью нового или какого-либо эквивалентного размещения, и определенно никогда не инициализировать разрушенный объект подобным образом и надеяться избежать UB.Такие классы, как std::vector
, очень явно делают доступ к разрушенным объектам UB, и он остается UB, даже если вы создадите новый элемент вместо него.