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

时间:2015-09-17 06:29:09

标签: 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();
}

我需要这个app变量必须是静态的。 我通过以下方式解决这个问题:

static QApplication& app = *new QApplication(argc, argv);

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

更新:添加有关报告的图片(并更新我正在使用的代码示例): enter image description here

2 个答案:

答案 0 :(得分:5)

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

崩溃的原因是你无法控制破坏的顺序。静态存储持续时间的值(例如示例中的QApplication)在main()退出后的某个时间被C ++运行时破坏。

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

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

答案 1 :(得分:1)

不要将QApplication app定义为static

您可以在代码的任何位置使用qAppQCoreApplication::instance()

示例:

QString appDir = qApp->applicationDirPath();

相同
QString appDir = QCoreApplication::instance()->applicationDirPath();