使用MSVC 2013进行静态变量初始化时崩溃




大家好!
最近我升级了我的开发环境。也就是说,我已经从问题4.8.4和MSVC 2010转移到问题5.3.1和MSVC 2013。我遇到的问题是,我的应用程序在启动时崩溃,堆栈跟踪证明崩溃发生在一些静态类字段的初始化过程中。
参见以下示例:

// 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的过程中,我发现MyClass::tr()方法最终调用QMetaObject::tr(),并且QMetaObject实例的所有字段似乎都是NULL。然后在引用其中一些时发生崩溃。

值得注意的是,这次崩溃并没有在Ubuntu 14.04和Qt 5.2.1的另一台机器上重现。

当然,我可以将MyClass的名称替换为QObject的名称,但我的项目由63个库组成,所以我担心可能的翻译冲突。

好吧,

class QObject : 
   static QString tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )

tr是一个静态函数,这意味着您不能引用虚拟方法表。(参见C++静态虚拟成员?)

问题是:您可以重载该方法,但不会调用对基对象的调用。不确定宏Q_OBJECT是如何交互的。但我认为它稍后会把它连接起来。

您是否验证了生成的QString是否使用QObject::tr()进行了翻译?

不确定这是否有效。需要测试一下。

编辑

已检查,事实上它只影响Qt 5.x,但请参阅http://qt-project.org/doc/qt-5/sourcebreaks.html

我记得他们在Qt 5中更改了翻译api中的内容。可能有一些隐藏的代码中断的混乱。

相关内容

  • 没有找到相关文章

最新更新