0

我试图std::exit在我的 GCC10 编译的 Qt 5 应用程序中记录调用。将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”。我不知道出口处理程序的任何相关限制。

有人可以告诉我这里出了什么问题吗?

4

1 回答 1

1

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

例如,qdatetime.cpp 至少包含一个静态查找表,它可能被 toString() 使用。调用堆栈上可能有更多对(已经销毁的)静态变量的访问。

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

于 2020-06-21T20:16:13.203 回答