静态QApplication变量使Mac在退出时报告崩溃

avi*_*iit 1 c++ macos qt static-variables

以下代码在Windows或Linux(Debian)上运行良好,但在Mac上报告退出时崩溃:

int main(int argc, char *argv[]) {
  static QApplication app(argc, argv);
  QPushButton w; w.show();
  return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

我需要这个app变量必须是静态的.我解决这个问题:

static QApplication& app = *new QApplication(argc, argv);
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这种风格.你有什么建议吗?非常感谢你!

更新:添加有关报告的图像(并更新我正在使用的代码示例): 在此输入图像描述

Rei*_*ica 5

你断言它"有效"的说法充其量只是隐喻.你没有提到崩溃发生在退出时.这是一个非常重要的细节.

崩溃的原因是你失去了对破坏顺序的控制.静态存储持续时间的值(例如QApplication在您的示例中)在main()退出后的某个时间由C++运行时破坏.

Qt内部使用静态变量用于各种目的.碰巧的是,当QApplication::~QApplication析构函数运行时,这些变量的值已经被破坏了.坠机发生在qt_call_post_routines(),在cleanupDevicesList()后例程.它试图访问死对象.

它在Windows和Linux上"工作"的原因与它在Mac上"不起作用"的原因相同:你面临着未定义的行为.未定义的行为仅仅意味着它既不能保证工作也不能保证失败.你碰巧看到两种极端的行为都是偶然的.问题的关键在于你不应该编写调用未定义行为的代码.它现在在Windows上"适用",但在重要的客户演示期间可能无效.