我正在使用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的假阳性还是我做错了什么?
提前致谢
答案 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