在使用MSVC 2013时静态变量初始化导致崩溃

3


大家好!
最近我升级了我的开发环境,从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个回答

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


但是我没有重载这个方法。它的重载版本是由Q_OBJECT宏自动添加的。实际上,在Qt 4和5的实现中没有任何区别。并且在子类中代表调用tr()的效果在第四个版本中运行良好。 顺便说一句,字符串由QObject::tr()来翻译。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接