Информация об изменениях

Сообщение Re: Продлить жизнь статической переменной в функции от 08.09.2022 19:54

Изменено 08.09.2022 19:55 Sm0ke

Re: Продлить жизнь статической переменной в функции
Здравствуйте, Went, Вы писали:

W>Здравствуйте. Хочется странного.

W>Есть функция — геттер синглтона:
W>
W>Singleton& get_singleton()
W>{
W>  static Singleton s_singleton;
W>  return s_singleton;
W>}
W>

W>По первому запросу объект создается, при разрушении статики — удаляется. Все хорошо.
W>Но иногда возникает ситуация, при которой происходят попытки обратиться к этому синглтону уже в процессе разрушения статики, и, иногда, уже после того, как переменная s_singleton разрушена.
W>Что делать? Я готов даже создавать новый экземпляр на куче или возвращать nullptr (допустим, функция возвращает указатель), но как надёжно определить тот факт, что статическая переменная уже разрушена? Можно поставить какой-то guard, который будет при разрушении ставить какую-то статическую переменную в особое состояние, но где гарантия, что дебагер, разрушая эту переменную, не затрёт её каким-то 0xDEADBEEF?

А можно сделать рефакторинг и объединить все объекты, работающие с этим классом в одну структуру, чтобы сделать синглтон от этой все структуры? Это вариант 1.

Вариант 2. Порядок уничтожения таких синглтонов обратен порядку их создания. Если нужен самый долгоживущий, то просто вызовите его раньше остальных.
Re: Продлить жизнь статической переменной в функции
Здравствуйте, Went, Вы писали:

W>Здравствуйте. Хочется странного.

W>Есть функция — геттер синглтона:
W>
W>Singleton& get_singleton()
W>{
W>  static Singleton s_singleton;
W>  return s_singleton;
W>}
W>

W>По первому запросу объект создается, при разрушении статики — удаляется. Все хорошо.
W>Но иногда возникает ситуация, при которой происходят попытки обратиться к этому синглтону уже в процессе разрушения статики, и, иногда, уже после того, как переменная s_singleton разрушена.
W>Что делать? Я готов даже создавать новый экземпляр на куче или возвращать nullptr (допустим, функция возвращает указатель), но как надёжно определить тот факт, что статическая переменная уже разрушена? Можно поставить какой-то guard, который будет при разрушении ставить какую-то статическую переменную в особое состояние, но где гарантия, что дебагер, разрушая эту переменную, не затрёт её каким-то 0xDEADBEEF?

А можно сделать рефакторинг и объединить все объекты, работающие с этим классом в одну структуру, чтобы сделать синглтон от этой всей структуры? Это вариант 1.

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