Подтвердить что ты не робот

Вызывает ли С++ деструкторы для глобальных и классовых переменных?

Из моей примерной программы, похоже, она вызывает деструкторы в обоих случаях. В какой момент он вызывает деструкторы для глобальных и классовых переменных, поскольку они должны быть выделены в разделе данных стека программ?

4b9b3361

Ответ 1

Из § 3.6.3 стандарта С++ 03:

Деструкторы (12.4) для инициализированных объектов статической продолжительности хранения (объявлены в области блока или в области пространства имен) вызываются в результате возврата из основного и в результате вызова exit (18.3). Эти объекты уничтожаются в обратном порядке завершения их конструктора или завершения их динамической инициализации. Если объект инициализирован статически, объект уничтожается в том же порядке, как если бы объект был динамически инициализирован. Для объекта массива или типа класса все подобъекты этого объекта уничтожаются до уничтожения любого локального объекта со статической продолжительностью хранения, инициализированной во время построения под-объектов.

Кроме того, в § 9.4.2 7 говорится:

Элементы статических данных инициализируются и уничтожаются точно так же, как нелокальные объекты (3.6.2, 3.6.3).

Однако, если деструктор не имеет наблюдаемого поведения, он не может быть вызван. Терри Махаффи подробно объясняет это в своем ответе на вопрос: "Является ли деструктор С++ гарантированно не вызываться до конца блока?" .

Ответ 2

Где-то после "основного"

(вы не можете знать или полагаться на точный порядок, в котором они вызываются)