我尝试在我的GCC10编译的Qt5应用程序中记录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;
}当变量b为空时,变量a包含预期的日期/时间。当使用UTC时间时,b为“GMT”。我不知道出口处理程序有任何相关的限制。
有人能告诉我这里出了什么问题吗?
发布于 2020-06-22 04:16:13
退出处理程序是在静态变量反初始化之后调用的,因此调用可能访问静态变量的函数是不安全的。
例如,toString()可能会使用qdatetime.cpp包含至少一个星期几的静态查找表。在调用堆栈上可能会有更多对静态变量的访问(已经被销毁)。
如果您在退出处理程序中确实需要这种信息,您可以分配一个静态的字符数组(没有new),并从main函数中写入日期字符串。我没有尝试过,但我希望.bss段中的内存在退出时不会清零,并且在全局反初始化后访问它仍然是安全的。
https://stackoverflow.com/questions/62450411
复制相似问题