2016-04-18 4 views
0

Я разрабатываю простой прототип с создателем qt.проблема valgrind с QDialog, указанная с qt-дизайнером

Я использовал дизайнера для того, чтобы проектировать мои окна.

Скажите нам, что в главном окне есть меню с опцией «Suspend». Когда выбрана эта опция, то вызывается метод MainWindow::on_actionSuspend_triggered() которого упрощена реализация может быть возобновлена ​​следующим образом:

void MainWindow::on_actionSuspend_triggered() 
{ 
    SuspendDialog suspend_dialog(this); 
    suspend_dialog.setModal(true); 
    auto status = suspend_dialog.exec(); 
    return; 
} 

SuspendDialog был указан с дизайнером, он является производным от QDialog класса, и это очень просто (три кнопки комбо-поле и спин-бокс.

Теперь, когда я запускаю valgrind внутри qtcreator для проверки использования памяти, я получаю две проблемы типа Mismatched free()/delete/delete []. Некоторые из них - это то, что две проблемы относятся к одной строке , который находится в конце деструктора SuspendDialog, реализация которого:

SuspendDialog::~SuspendDialog() 
{ 
    delete ui; 
} 

Это было автоматически сгенерировано qt-дизайнером.

Мой вопрос: является ли это ложным положительным результатом valgrind или я делаю неправильно?

Заранее спасибо

+0

Задача не имеет ничего общего с большинством тегов, кроме Qt. Я также подумал, что могу исправить текст, но потом решил не делать этого: слишком много. – AlexanderVX

ответ

1

Поступая ниже вас на рожон:

SuspendDialog suspend_dialog(this); // wrong! do not pass 'this' here 

Передача указателя на «это» в Qt означает, что вы передаете родителя, ответственного за выпуск этого виджета , Или релиз произойдет дважды: сначала, когда объект в стеке будет уничтожен, а затем, когда родительский объект будет уничтожен.

Если выполнить диалог с exec() вы можете выделить виджет диалога на стеке, но не проходят this к нему:

SuspendDialog suspend_dialog; 
    // 
    suspend_dialog.exec(); // exec() only 

Или вы можете выделить виджет диалога в куче, а затем вы можете передать this к нему:

SuspendDialog* pSuspendDialog = new SuspendDialog(this); 
    // 
    pSuspendDialog->exec(); // or maybe show() depending on task 
+0

Прежде всего: спасибо за ваш ответ !. Я попытался с первого взгляда, и это вызвало крах. По-видимому, когда диалог закрыт, главное окно закрывается. Возможно, важно отметить, что приложение является многопоточным. Напротив, со вторым способом (с использованием 'new'), который работает отлично, и проблема valgrind больше не показана. Мне любопытно понять, почему первый способ не работает. Я голосую на ваш вопрос, и я думаю, что буду отмечать его как принятый ответ. Но я немного подожду для других ответов – lrleon

 Смежные вопросы

  • Нет связанных вопросов^_^