Почему деструктор глобальных экземпляров класса вызывается в обратном порядке?
Почему деструкторы глобальных объектов вызываются в обратном порядке? Я понимаю, про локальные экземпляры класса, они создаются на стеке, а стек работает по принципу: "последний вошёл, первый вышел", но почему так происходит у глобальных объектов я не понимаю.
Ответы (1 шт):
Давайте рассмотрим два объекта a и b. У них будет время жизни. Прерывистые чёрточки - время. Скобки - конструктор и деструктор объекта. Имя объекта записано между скобками. Времена жизни объектов могут сочетаться следующим образом:
[a] [ a ] [ a ]
1. ------- 2. ------- 3. -------
[b] [ b ] [b]
[a] [ a ]
4. ------- 5. -------
[ b ] [ b ]
[a]
6. -------
[b]
Все шесть вариантов возможны если a и b не зависят друг от друга. Пусть теперь a использует b. Самое безопасное сочетание времён жизни тогда 4: b рождается до a и умирает позже. Нет опасности обратиться к неинициалированной или уже освобождённой памяти.
Наоборот: b использует a. Самый безопасный вариант тогда третий.
В обоих сценариях порядок уничтожения противоположен порядку создания. Вот и всё обоснование: стековый порядок конструирования уменьшает число потенциальных ошибок.