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

标签 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 的机器上重现。

当然,我可以替换 MyClassQObject 命名一,但我的项目包含 63 个库,所以我担心可能的翻译冲突。

最佳答案

好,

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 的 translate api 中改变了一些东西。可能在一些隐藏的代码中断中可能会出现困惑。

关于visual-c++ - 使用 MSVC 2013 进行静态变量初始化时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25912904/

相关文章:

c++ - 向 VS C++ 控制台程序添加视觉效果

c++ - 比较短和长是隐式转换吗?

c++ - 如何重写 Visual Studio 文本编辑器的部分内容?

sql - 粘贴较大的多行字符串(大约1500行)后,Visual Studio 2010崩溃

c++ - std::string 在 msvcp90d.dll 中完全崩溃

ios - 了解 iOS 崩溃日志

c++ - Qt 5.8 和 Pdf.js 错误

c++ - Qt 5.11 - 将外部应用程序嵌入到 QWidget 中

c++ - 在 C++ 中顺序对齐函数

qt - 如何在 QML 中查询键盘修饰符?