Прошу перечислить возможные варианты
Вариант единственный: деструктор в C++ вызывается ровно в тот момент, когда
уничтожается объект.
Всё. Точка.
Никаких других "вариантов" нет и быть не может, потому что в C++ не может быть сборки мусора.
А вот когда объект уничтожается - тут могут быть некоторые варианты: явное и неявное уничтожение, уничтожение по выходу из блока, уничтожение по эпилогу программы... Здесь разница уже в том. что называют "время жизни" объекта.