Crash on static variable initialization with MSVC 2013
大家好!最近我升级了我的开发环境。也就是说,我已经从qt 4.8.4和msvc 2010迁移到qt 5.3.1和msvc 2013。我面临的问题是,我的应用程序在启动时崩溃,堆栈跟踪证明崩溃发生在某些静态类字段的初始化过程中。请参见以下示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // header file class MyClass : QObject Q_OBJECT public: ... private: static const QString CLASS_NAME; // *.cpp file const QString MyClass::CLASS_NAME = MyClass::tr("FOO"); // crash when calling tr() const QString MyClass::CLASS_NAME = QObject::tr("FOO"); // but this works normally |
在Qt的调试过程中,我发现
值得注意的事实是,在另一台使用Ubuntu 14.04和Qt5.2.1的机器上,不会再现碰撞。
当然,我可以把
好,
1 2 3 | class QObject : static QString tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) |
tr是一个静态函数,这意味着您不能引用虚方法表。(参见C++静态虚拟成员?)
问题是:您可以重载方法,但不调用对基对象的调用。不确定Macro Q_对象是如何交互的。但我想以后会联系上的。
是否验证了结果qString是否是使用qObject::tr()转换的?
不安静,确定这是否有效。需要测试一下。
编辑:
检查过,确实只影响qt 5.x,但请参考http://qt-project.org/doc/qt-5/sourcebreaks.html
我记得他们在Qt5中更改了翻译API中的内容。可能是一些隐藏的代码中断造成了混乱。