qt designer 指定的 QDialog 的 valgrind 问题

valgrind issue with QDialog specified with qt designer

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

我使用设计器来设计我的 windows。

假设主 window 有一个菜单,其中有一个名为 "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 class并且非常简单(三个按钮,一个组合框和一个旋转框。这个class不分配内存。

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

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

而那是由 qt designer 自动生成的。

我的问题是:这是 valgrind 的误报还是我做错了什么?

提前致谢

你这样做是自找麻烦:

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

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

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

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

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

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