4

所以主题行中提到的代码会导致 Qt 4.8.3 和 gcc 4.7.2 出现分段错误

这位于 .cpp 文件的任何类/结构之外,适用于 gcc 4.4

const QList<int> warnings = QList<int>() << 0 << 3 << 7;

Traces 给出了这两个提示:

__do_global_ctors()
__static_initialization_and_destruction_0

因此,在将后一个列表插入其中时,似乎“警告”尚不可用。

如果我将其更改为以下内容,则适用于 4.7.2:

global scope: QList< int> warnings;

这是一些功能:

warnings = QList<int>() << 0 << 3;

我想知道为什么会这样?

编辑:

我想我最初从我的问题中剪掉了太多东西,但是警告应该是文件范围(.cpp-file)中的 const 用于保存一堆枚举。

4

1 回答 1

6

我的精神调试能力告诉我,有问题的行存在于全局/文件范围内,而不是在类/函数范围内。因此,您的线路可以在静态初始化期间的任何时候被调用。使用您的旧 gcc,恰好在调用您的行之前初始化了 QT。使用新的 gcc,它重新排序(完全合法)静态 init 以首先调用您的函数,然后 QT 准备好创建对象并将其插入其中。

解决方案是推迟创建它,QList直到main开始之后。使用指针或静态本地对象是两种常见的实现。

于 2012-11-07T14:42:06.120 回答