Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QDateTime::toString()在退出处理程序中使用时失败_C++_Qt_Handler_Exit Code_Qdatetime - Fatal编程技术网

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

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

我试图在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;
}
变量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至少包含一周中几天的静态查找表。在整个调用堆栈上可能有更多对静态变量的访问。