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
我正在使用 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