Как справиться с предупреждением "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)

640   1  

1 ответ:

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

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

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

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

Comments

    Ничего не найдено.