Я недавно испытал exit code 255
в моем приложении Qt 5.7. Это произошло сразу после того, как я добавил свой обычай QGestureRecognizer
, Я отладил источники Qt и пришел к выводу, что QGestureManager
автоматически избавляется от всех QGestureRecognizer
экземпляров. Строка, которая вызывает проблему, находится внутри деструктора виджета, где распознаватель создан и зарегистрирован:
Demo::~Demo() {
// delete other stuff
delete recognizer;
}
Дело в том QGestureRecognizer
не поддерживает (по крайней мере, согласно документации и, глядя на подпись конструктора) parent-child
отношения в Qt, так как он не является производным от QObject
(или любой подкласс этого фундаментального класса Qt). Это означает, что нельзя назначить parent
чтобы его конструктор, следовательно, QCustomGestureRecognizer recognizer = new QCustomGestureRecognizer (this)
не возможно Продолжая эту мысль, это означает, что нужно вручную вызвать деструктор, вызвав delete recognizer
, Или так я думал …
В конце жизни моего приложения QGestureManager
называется. Там есть список распознавателей называется m_recognizers
, Он содержит набор встроенных распознавателей (например, один для Tap
жест) вместе с зарегистрированным пользовательским распознавателем (в моем случае он был зарегистрирован как 257
). Деструктор QGestureManager
перебирает список и удаляет его записи.
Когда delete recognizer
линия присутствует, я получаю ошибку сегментации, когда qDeleteAll(...)
(для m_recognizers
) достигает записи пользовательского распознавателя, поскольку он пытается удалить то, что уже было удалено.
После того, как я закомментировал delete recognizer
Строка в деструкторе моего виджета Я больше не сталкиваюсь с проблемой, однако я все еще не уверен, не нарушу ли я где-нибудь свой код. Код выхода не является (как ожидалось) 0
но информация о том, как распознать распознаватели, полностью отсутствует в официальной документации.
Кто-нибудь сталкивался с этой проблемой? Я не исключаю, что проблема возникает из-за какой-то другой части моего кода, хотя кажется маловероятным, учитывая, что она появляется, когда по умолчанию QWidget
деструктор называется. Согласно стандарту C ++ при наследовании класса сначала вызывается деструктор подкласса (в моем случае это Demo
Кастомный виджет — проблем нет), а затем и базовый класс.
Если вы используете
Qt::GestureType QGestureRecognizer::registerRecognizer(QGestureRecognizer *recognizer)
Система вступает во владение объектом, и вы не должны удалять его самостоятельно.
Выдержка из документации:
Приложение становится владельцем распознавателя и возвращает
ID типа жеста, связанный с ним.
Других решений пока нет …