Как справиться с предупреждением "exit-time destructor" в clang?
В моем коде C++11 я получаю предупреждение clang "объявление требует деструктора времени выхода"в следующем случае:
static const std::map<int, const someStruct> mymap = {
{1, {
"A",
"B",
"C"
}},
{2, {
"D",
"E",
"F"
}}
};
Насколько я понимаю Google, "деструктор времени выхода" необходим для уничтожения main() и статики детерминированным способом, чтобы предотвратить сбои при выходе из-за"уже выпущенных переменных". Это правда? Может ли кто-нибудь объяснить это лучше?
Плюс: что я могу с этим поделать (я не хочу отключать предупреждение)? Приведенный выше код используется в контексте одного только нитки.
Похоже, что именно так Chromium работает с этими случаями; будет ли это правильным способом и для моего случая?
#define CR_DEFINE_STATIC_LOCAL(type, name, arguments)
static type& name = *new type arguments
(Источник: https://chromium.googlesource.com/chromium/src/+/32352ad08ee673a4d43e8593ce988b224f6482d3/base/basictypes.h)
1 ответ:
Глобальные и функциональные статические объекты будут вызывать свои деструкторы при выходе из приложения. эти деструкторы являются "деструкторами времени выхода". и называются в обратном порядке, в котором они были построены.
Как вы сказали,если некоторые из этих деструкторов коснутся уже уничтоженных объектов, ваша программа может аварийно завершиться. Кроме того, деструкторы, работающие во время выхода, замедляют выход программы, и большую часть времени они не нужны для корректности программы (так как когда программа завершит работу, она все равно освободит всю свою память).
Предупреждение просто указывает на то, что у вас есть деструкторы, которые будут запущены во время выхода.
Предложенное исправление будет выделять объект в куче, что не приведет к его автоматическому уничтожению при выходе из программы. Для вашего случая этого, вероятно, достаточно.
Comments