Подтвердить что ты не робот

Как бороться с предупреждением о деструкторе "выход из времени" в clang?

В моем коде С++ 11 я получаю предупреждение clang "Декларация требует деструктора времени выхода" в следующем случае:

static const std::map<int, const someStruct> mymap = {
    {1, {
        "A",
        "B",
        "C"
    }},
    {2, {
        "D",
        "E",
        "F"
    }}
};

Насколько я понимаю, Google "деструктор времени выхода" должен уничтожать main() и статику детерминированным способом для предотвращения сбоев при выходе из-за "уже выпущенных переменных". Это правильно? Может кто-нибудь объяснить это лучше?

Плюс: Что я могу сделать с этим (я не хочу отключать предупреждение)? Приведенный выше код используется только в контексте только одного потока.

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

#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
  static type& name = *new type arguments

(Источник: https://chromium.googlesource.com/chromium/src/+/32352ad08ee673a4d43e8593ce988b224f6482d3/base/basictypes.h)

4b9b3361

Ответ 1

Глобальные и статические объекты функции получат свои деструкторы, вызванные при выходе из вашего приложения. эти деструкторы являются "деструкторами времени выхода". и вызываются в обратном порядке, чтобы они были построены в.

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

Предупреждение просто указывает, что у вас есть деструкторы, которые будут запускаться во время выхода.

Исправление, которое вы предложили, будет кучкой выделять объект, который не приведет к его автоматическому уничтожению при выходе программы. Для вашего случая это, вероятно, достаточно хорошо.