хранение глобальных переменных при уничтожении или выгрузке

0

Я не понимаю, можно ли повторно использовать или выпускать хранилище для статических глобальных переменных, особенно после вызова глобальных деструкторов для других объектов.

Если в одном файле у меня есть:

static int a; // предположить, что значение a будет меняться когда-нибудь во время программы

int getA() {return a; } }

И в другом файле:

extern int getA();

класс B {

общественности:

~B() { if (getA() ==..... }

};

статический B b;

Всегда ли безопасно ссылаться на getA() в ~ B() (учитывая, что порядок глобальных деструкторов может быть неопределенным между единицами перевода), или может ли хранилище для "a" быть выпущено или повторно использовано средой выполнения в какой-то момент?

Я знаю, что во время инициализации для глобальных переменных есть 2 фазы, статические и динамические, во время статической фазы их память заполняется 0 с и в динамических фазовых конструкторах. Есть ли что-то подобное в обратном порядке для завершения и разгрузки?

Стандарт C++ говорит об этом?

Теги:
static
global-variables
destructor

2 ответа

0
Лучший ответ

Краткий ответ - нет. Это часть разделов.data или.bss вашей программы.

Конечно, он может быть повторно использован "незаконно", если вы знаете адрес и хотите использовать это пространство. Но это всегда так. От начала до конца.

0

Я не понимаю, можно ли повторно использовать или выпускать хранилище для статических глобальных переменных, особенно после вызова глобальных деструкторов для других объектов.

Если вы имеете в виду память, она никогда не "освобождается" (не отображается из пространства памяти процесса)

Всегда ли безопасно ссылаться на getA() в ~ B() (учитывая, что порядок глобальных деструкторов может быть неопределенным между единицами перевода), или может ли хранилище для "a" быть выпущено или повторно использовано средой выполнения в какой-то момент?

Да. int a is POD и не имеет ctor.

Я знаю, что во время инициализации для глобальных переменных есть 2 фазы, статические и динамические, во время статической фазы их память заполняется 0 с и в динамических фазовых конструкторах. Есть ли что-то подобное в обратном порядке для завершения и разгрузки?

Из представления программы вы можете просто игнорировать статическую фазу. "выгрузка", о которой вы говорили, обычно выполняется ядром. В Linux он находится в системном вызове exit_group/_exit

  • 0
    Объект, являющийся POD, не означает, что вам разрешен доступ к его содержимому после его уничтожения.
  • 0
    это не будет «уничтожено». раздел .bss существует, когда ваша программа все еще работает
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню