Почему деструктор глобальных экземпляров класса вызывается в обратном порядке?

Почему деструкторы глобальных объектов вызываются в обратном порядке? Я понимаю, про локальные экземпляры класса, они создаются на стеке, а стек работает по принципу: "последний вошёл, первый вышел", но почему так происходит у глобальных объектов я не понимаю.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Давайте рассмотрим два объекта 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. Самый безопасный вариант тогда третий.

В обоих сценариях порядок уничтожения противоположен порядку создания. Вот и всё обоснование: стековый порядок конструирования уменьшает число потенциальных ошибок.

→ Ссылка