Как уже упоминалось в этом ответе просто вызов деструктора во второй раз уже есть 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. Таким образом, для вышеприведенного кода необходимо выполнить некоторые требования к реализации и/или платформе.
Почему именно этот код сломался и при каких условиях?