qt设计器指定的QDialog的valgrind问题

valgrind issue with QDialog specified with qt designer

本文关键字:QDialog valgrind 问题 qt      更新时间:2023-10-16

我正在用qt-creator开发一个简单的原型。

我用了designer来设计我的窗户。

假设主窗口有一个菜单,其中包含一个名为"挂起"的选项。当选择该选项时,它被称为方法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类派生的,它非常简单(三个按钮,一个组合框和一个旋转框。这个类不分配内存。

现在,当我在qtcreator内部运行valgrind以检查内存使用情况时,我会遇到两个类型为Mismatched free() / delete / delete []的问题。有些奇怪的是,这两个问题指的是同一行,它位于SuspendDialog的析构函数的末尾,其实现为:

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

这是qt设计器自动生成的。

我的问题是:这是勇气的错误肯定,还是我做错了什么?

提前感谢

通过以下操作,您是在找麻烦:

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

在Qt中传递指向"this"的指针意味着您传递负责发布小部件的父级。或者,释放将发生两次:第一次是堆栈上的对象被销毁,第二次是父对象被销毁。

如果使用exec()执行对话框,则仍然可以在堆栈上分配对话框小部件,但不将this传递给它:

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

或者,您可以在堆中分配对话框小部件,然后将this传递给它:

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