QDateTime :: toString () не работает при использовании в обработчике выхода - PullRequest
0 голосов
/ 18 июня 2020

Я попытался зарегистрировать std::exit вызовов в моем приложении Qt 5, скомпилированном с GCC10. Это не удается при преобразовании объекта QDateTime в строку. Его можно воспроизвести с помощью следующего фрагмента:

void exitHandler() noexcept
{
   QString b = QDateTime::currentDateTime().toString();
}

int main(int pArgc, char* pArgv[]) noexcept
{
   std::atexit(&exitHandler);
   QString a = QDateTime::currentDateTime().toString();
   std::exit(1);

   return 0;
}

Переменная a содержит ожидаемую дату / время, а переменная b пуста. При использовании времени UT C, b - это «GMT». Мне не известны какие-либо связанные ограничения обработчиков выхода.

Может ли кто-нибудь сказать мне, что здесь происходит не так?

1 Ответ

1 голос
/ 21 июня 2020

Обработчики выхода вызываются после деинициализации переменных stati c, и поэтому небезопасно вызывать функции, которые могут обращаться к переменным stati c.

qdatetime. Например, cpp содержит по крайней мере одну stati c таблица поиска дней недели, которая, вероятно, используется toString (). В стеке вызовов может быть больше обращений к (уже уничтоженным) переменным stati c.

Если вам действительно нужна такая информация в обработчике выхода, вы можете выделить массив символов stati c (без new) и напишите туда строку даты из основной функции. Я не пробовал, но ожидаю, что память в сегменте .bss не обнуляется при выходе, и доступ к ней после глобальной деинициализации все еще безопасен.

...