以下代码在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);
但我不喜欢这种风格。你有什么建议吗? 非常感谢你!
答案 0 :(得分:5)
你断言它"有效"充其量是隐喻。你没有提到崩溃发生在退出时。这是一个非常重要的细节。
崩溃的原因是你无法控制破坏的顺序。静态存储持续时间的值(例如示例中的QApplication
)在main()
退出后的某个时间被C ++运行时破坏。
Qt在内部使用静态变量用于各种目的。碰巧运行QApplication::~QApplication
析构函数时,这些变量的值已被破坏。崩溃发生在qt_call_post_routines()
后cleanupDevicesList()
例程中。它试图访问死对象。
它"工作的原因" Windows和Linux上的原因与它不起作用的原因相同。在Mac上:您面临未定义的行为。未定义的行为仅仅意味着它既不能保证工作也不能保证失败。你碰巧看到两种极端的行为都是偶然的。问题的关键在于你不应该编写调用未定义行为的代码。它"工作"今天在Windows上,对于您而言,但在重要的客户演示期间可能无法正常工作。
答案 1 :(得分:1)
不要将QApplication app
定义为static
。
您可以在代码的任何位置使用qApp
或QCoreApplication::instance()
。
示例:
QString appDir = qApp->applicationDirPath();
与
相同QString appDir = QCoreApplication::instance()->applicationDirPath();