const QList & lt; int & gt; warnings = QList & lt; int & gt; () & lt; & lt; 0; segfaults с gcc 4.7.2

Поэтому код, упомянутый в строке темы, вызывает ошибку сегментации в Qt 4.8.3 & gcc 4.7.2

Это вне любых классов / структур в .cpp-файле и работает с gcc 4.4

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

Трассировка дает эти две подсказки:

__do_global_ctors()
__static_initialization_and_destruction_0

Таким образом, кажется, что «предупреждение» еще не доступно при вставке в него последнего списка.

Работает с 4.7.2, если я изменю это на это:

global scope: QList< int> warnings;

Это какая-то функция:

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

Мне интересно, почему это происходит?

Редактировать:

Я предполагаю, что изначально я вырезал слишком много материала из своего вопроса, но предполагается, что предупреждения должны быть постоянными в области видимости файла (.cpp-файл) для хранения перечислений.

4

Решение

Мои умственные способности отладки говорят мне, что рассматриваемая строка существует в глобальной области / области файла, а не в области класса / функции. Таким образом, ваша строка может быть вызвана в любой точке статической инициализации. С вашим старым gcc просто так получилось, что QT инициализирован до Ваша линия была названа. С новым gcc он переупорядочил (совершенно допустимый) статический init, чтобы сначала вызвать вашу функцию, прежде чем QT будет готов создавать объекты и вставлять в них.

Решение состоит в том, чтобы отложить создание QList до после main начинается. Использование указателей или статических локальных объектов является двумя распространенными реализациями.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]