使用qt designer指定的QDialog的valgrind问题

时间:2016-04-18 22:42:30

标签: c++ qt qt-creator valgrind qt-designer

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

我使用设计师来设计我的窗户。

告诉我们主窗口有一个菜单,其中包含一个名为“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类,它非常简单(三个按钮,一个组合框和一个旋转框。这个类不分配内存。

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

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

这是由qt designer自动生成的。

我的问题是:这是valgrind的假阳性还是我做错了什么?

提前致谢

1 个答案:

答案 0 :(得分: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