Есть ли способ «обнаружить» или обойти разрушение синглтона (без утечки)? - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть управляемая и упрощенная система журналов - однако, как она работает, она должна отслеживать некоторое глобальное состояние.Это делается с помощью синглтона Мейера, который инициализируется при первом использовании.Однако, это, кажется, имеет недостаток: возможно вызвать что-то, что будет зарегистрировано после того, как синглтон был уничтожен (если порядок не известен - что может быть трудно утверждать в более крупной программе) - приводя к UB (сбой при завершении работыСкорее всего).

Низкоуровневая функция журнала выглядит примерно так:

void logImpl(const char* log, const std::string& message, Severity::Type level) {
  static LogSys& logSys = LogSys::instance();
  ...
}

Я, конечно, могу навязать проблему «пользователю» библиотеки, но это не такдействительно решить проблему (все еще ручная обработка).Решит ли что-либо встроенное статическое в .h что-нибудь? (Наверное, нет).У нас есть деструктор одиночного прогона, но имеет ли смысл писать что-либо, чтобы указать, что он был уничтожен?Синглтон другого Мейера?Что произойдет, если вы инициализируете синглтон мейера во время статического разрушения?

1 Ответ

0 голосов
/ 01 февраля 2019

Принцип единой ответственности: создайте функцию, единственной целью которой является создание синглтона при первом использовании, и верните его.

Единственный случай, когда статический объект может быть уничтожен до регистрации, - это сообщение журнала.отправлено от деструктора (другого) статического объекта.Если деструктор (или любая другая функция-член) может захотеть войти в систему, вызовите метод получения одиночного значения в конструкторе.Это обеспечивает правильный порядок уничтожения.

Все еще есть небольшая проблема в случае, если деструктор вызывает функцию, и регистрация происходит косвенно и неожиданно.Приведенное выше соглашение решает проблему при вызове любой функции-члена, но проблема остается, если есть вызов любой свободной функции, которая не может обеспечить порядок.Этой проблемы можно избежать, если вы ограничите себя от использования синглтона из любой свободной функции.Если вы не можете привести себя к такому ограничению (понятно), то вы можете просто добавить вызов конструктора каждого статического объекта для обеспечения порядка на всякий случай.

Однако ни одно из этих ограничений не может быть применено в языке.К сожалению,Вот почему следует избегать зависимости между статическими объектами, такими как чума, - статическими объектами вообще в некоторой меньшей степени.

...