Я не понимаю, можно ли повторно использовать или выпускать хранилище для статических глобальных переменных, особенно после вызова глобальных деструкторов для других объектов.
Если в одном файле у меня есть:
static int a; // предположить, что значение a будет меняться когда-нибудь во время программы
int getA() {return a; } }
И в другом файле:
extern int getA();
класс B {
общественности:
~B() { if (getA() ==..... }
};
статический B b;
Всегда ли безопасно ссылаться на getA() в ~ B() (учитывая, что порядок глобальных деструкторов может быть неопределенным между единицами перевода), или может ли хранилище для "a" быть выпущено или повторно использовано средой выполнения в какой-то момент?
Я знаю, что во время инициализации для глобальных переменных есть 2 фазы, статические и динамические, во время статической фазы их память заполняется 0 с и в динамических фазовых конструкторах. Есть ли что-то подобное в обратном порядке для завершения и разгрузки?
Стандарт C++ говорит об этом?
Краткий ответ - нет. Это часть разделов.data или.bss вашей программы.
Конечно, он может быть повторно использован "незаконно", если вы знаете адрес и хотите использовать это пространство. Но это всегда так. От начала до конца.
Я не понимаю, можно ли повторно использовать или выпускать хранилище для статических глобальных переменных, особенно после вызова глобальных деструкторов для других объектов.
Если вы имеете в виду память, она никогда не "освобождается" (не отображается из пространства памяти процесса)
Всегда ли безопасно ссылаться на getA() в ~ B() (учитывая, что порядок глобальных деструкторов может быть неопределенным между единицами перевода), или может ли хранилище для "a" быть выпущено или повторно использовано средой выполнения в какой-то момент?
Да. int a is POD и не имеет ctor.
Я знаю, что во время инициализации для глобальных переменных есть 2 фазы, статические и динамические, во время статической фазы их память заполняется 0 с и в динамических фазовых конструкторах. Есть ли что-то подобное в обратном порядке для завершения и разгрузки?
Из представления программы вы можете просто игнорировать статическую фазу. "выгрузка", о которой вы говорили, обычно выполняется ядром. В Linux он находится в системном вызове exit_group/_exit