QDateTime::toString() 在退出处理程序中使用时失败

QDateTime::toString() fails when used in exit handler

我试图在我的 GCC10 编译的 Qt 5 应用程序中记录 std::exit 调用。将 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 包含预期的 date/time,而变量 b 为空。使用 UTC 时间时,b 为“GMT”。我不知道出口处理程序有任何相关限制。

谁能告诉我这里出了什么问题?

退出处理程序在静态变量取消初始化后调用,因此调用可能访问静态变量的函数是不安全的。

例如,

qdatetime.cpp 包含至少一个静态查找 table 可能由 toString() 使用的星期几。调用堆栈上可能有更多对(已销毁的)静态变量的访问。

如果您确实需要在退出处理程序中使用此类信息,您可以分配一个静态字符数组(没有新的)并从主函数中写入日期字符串。我没试过,但我希望 .bss 段中的内存在退出时不会归零,并且在全局取消初始化后访问它仍然是安全的。