【问题标题】:const QList<int> warnings = QList<int>() << 0; segfaults with gcc 4.7.2常量 QList<int> 警告 = QList<int>() << 0; gcc 4.7.2 的段错误
【发布时间】:2012-11-07 13:25:17
【问题描述】:

所以主题行中提到的代码会导致 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 用于保存一堆枚举。

【问题讨论】:

  • 这看起来很简单。表达式被解析为const QList&lt;int&gt; warnings = (QList&lt;int&gt;() &lt;&lt; 0 &lt;&lt; 3 &lt;&lt; 7);,对吗?
  • 另外,const QList&lt;int&gt; warnings = QList&lt;int&gt; &lt;&lt; 0 &lt;&lt; 3 &lt;&lt; 7;呢? (没有括号可以调用构造函数。)
  • 这和写int i = int &lt;&lt; 1;差不多一样不会编译。
  • 确实我仍然想知道how can one achieve that 使用临时对象..
  • 用冒号结束类定义? ideone.com/dVFBWf :)

标签: c++ qt gcc4.7


【解决方案1】:

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

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

【讨论】:

  • 我认为你是对的。使用堆栈中的这两个 (do_global_ctors..) 函数,它为全局/文件范围进行静态初始化。太糟糕了,我继承的代码库中充满了类似的 const qlist。
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多