Сбой программы Qt при завершении работы

#qt

#qt

Вопрос:

Я создаю одну из своих первых программ Qt. У меня в этой форме входа в систему, затем предоставленные имя пользователя и пароль будут проверены в базе данных MYSQL. Если есть запись с этим именем пользователя и паролем, то она создает некоторые

 ui->something->hide();
  

Во время работы нет специальных выходных данных консоли Qt, но когда я закрываю ее кнопкой «x», программа выходит из строя.

Я запустил его в режиме отладки. Что я получил:

«Подчиненный остановился, потому что получил сигнал от операционной системы. Имя сигнала: Сигнал SIGSEGV Значение: ошибка сегментации

Комментарии:

1. попробуйте проверить stackframe, например, с помощью gdb

2. Можете ли вы опубликовать здесь какой-нибудь код?

3. Если нельзя определить, в чем проблема, просто взглянув на эту сборку, следует выбросить компьютер и отказаться от программирования: D

Ответ №1:

Вероятно, происходит то, что у вас есть объект, который выходит за рамки.

Когда что-то удаляется или становится недоступным, а затем вы пытаетесь получить к нему доступ, вы получите это.

Два действия, которые вы должны предпринять:

Если вы создаете объект в Qt, поместите его в кучу, а затем поместите его в дерево объектов.

Например:

 QLabel * label = new QLabel();  // put it on the heap using new

ui->centralWidget()->layout()->addWidget(label);
  

Теперь ваша метка находится в дереве объектов. Родительским элементом метки является объект Layout . Его родительским элементом является центральный виджет. Его родительским элементом является пользовательский интерфейс.

Когда окно закрыто, оно автоматически очистит все дочерние элементы, или, другими словами, вам не нужно вызывать delete для каждого из них.

Иногда примеры показывают вещи, которых нет в куче, но это обычно плохо работает в более крупных примерах, если только это не недолговечный элемент, такой как диалоговое окно, на которое больше нигде нет ссылок.

Также в вашем closeEvent() вы должны очистить доступ к вашей БД. Посмотрите на примеры базы данных и найдите строки кода, используемые для закрытия дескриптора (ов) базы данных.

Если вы выполняете очистку и есть вероятность, что она недоступна во время выполнения, вам следует проверить.

 if(label)
    label->setText("I am closing now");
  

И в некоторых случаях вы можете захотеть установить указатель на ноль после его удаления или закрытия.

Надеюсь, это поможет.