关于VisualC++:用MSVC 2013崩溃静态变量初始化

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

值得注意的事实是,在另一台使用Ubuntu 14.04和Qt5.2.1的机器上,不会再现碰撞。

当然,我可以把MyClass的名字改成QObject的名字,但我的项目包括63个图书馆,所以我担心可能的翻译冲突。


好,

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中的内容。可能是一些隐藏的代码中断造成了混乱。