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

时间:2014-09-18 12:41:45

标签: visual-c++ crash qt5 static-members

嗨大家好!
最近我升级了我的发展环境。也就是说,我已经从Qt 4.8.4和MSVC 2010转到Qt 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个库,所以我担心可能存在翻译错误。

1 个答案:

答案 0 :(得分:1)

那么,

class QObject : 

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

tr是一个静态函数,这意味着你不能引用虚拟的方法表。 (见C++ static virtual members?

问题是:您可以重载方法,但不调用对基础对象的调用。不确定宏 Q_OBJECT 是如何进行干涉的。但我认为它会在以后连接它。

您是否确认是否使用QObject :: tr()?

翻译了生成的QString

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

修改

选中它,确实只影响Qt 5.x,但请参考http://qt-project.org/doc/qt-5/sourcebreaks.html

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