Как уже упоминалось в этом ответе просто вызов деструктора во второй раз уже есть undefined поведение 12.4/14 (3.8).
Например:
class Class {
public:
~Class() {}
};
// somewhere in code:
{
Class* object = new Class();
object->~Class();
delete object; // UB because at this point the destructor call is attempted again
}
В этом примере класс сконструирован таким образом, что деструктор можно было бы вызвать несколько раз - такие вещи, как двойное удаление, не могут произойти. Память по-прежнему распределяется в точке, где вызывается delete
- первый вызов деструктора не вызывает ::operator delete()
для освобождения памяти.
Например, в Visual С++ 9 приведенный выше код выглядит работоспособным. Даже С++-определение UB напрямую не запрещает работать, как UB. Таким образом, для вышеприведенного кода необходимо выполнить некоторые требования к реализации и/или платформе.
Почему именно этот код сломался и при каких условиях?