C++ QDateTime::toString()在退出处理程序中使用时失败
我试图在GCC10编译的qt5应用程序中记录std::exit调用。将QDateTime对象转换为字符串时,此操作失败。可以使用以下代码片段复制该文件:C++ QDateTime::toString()在退出处理程序中使用时失败,c++,qt,handler,exit-code,qdatetime,C++,Qt,Handler,Exit Code,Qdatetime,我试图在GCC10编译的qt5应用程序中记录std::exit调用。将QDateTime对象转换为字符串时,此操作失败。可以使用以下代码片段复制该文件: void exitHandler() noexcept { QString b = QDateTime::currentDateTime().toString(); } int main(int pArgc, char* pArgv[]) noexcept { std::atexit(&exitHandler); Q
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为空。使用UTC时间时,b是GMT。我不知道退出处理程序的任何相关限制
有人能告诉我这里出了什么问题吗?退出处理程序是在静态变量去初始化之后调用的,因此调用可能访问静态变量的函数是不安全的 例如,qdatetime.cpp至少包含一周中的几天的静态查找表,toString可能会使用该表。调用堆栈上可能有更多对已销毁的静态变量的访问
如果您确实需要退出处理程序中的此类信息,则可以分配一个静态字符数组,而不使用new,并从main函数中写入日期字符串。我没有尝试过,但我希望.bss段中的内存在退出时不会归零,并且在全局去初始化后访问它仍然是安全的。哪个平台/操作系统?哪个Qt版本?无法复制错误。它适用于我Windows 10,Qt 5.12.1不可复制,a和b都有值,按预期工作。如何获得b的值?也许你的方法不正确?我认为@G.M.是对的。退出处理程序在静态变量取消初始化后调用。QDateTime.cpp至少包含一周中几天的静态查找表。在整个调用堆栈上可能有更多对静态变量的访问。