Вызывает ли C ++ деструкторы для глобальных и классовых статических переменных? - PullRequest
47 голосов
/ 05 февраля 2010

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

Ответы [ 2 ]

61 голосов
/ 05 февраля 2010

Из п. 3.6.3 стандарта C ++ 03:

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

Кроме того, § 9.4.2 7 гласит:

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

Однако, если деструктор не имеет наблюдаемого поведения, он не может быть вызван. Терри Махаффи подробно описывает это в своем ответе на вопрос «Гарантируется ли, что деструктор C ++ не будет вызываться до конца блока?» .

2 голосов
/ 05 февраля 2010

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

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

...