gpt4 book ai didi

c++ - qt designer 指定的 QDialog 的 valgrind 问题

转载 作者:行者123 更新时间:2023-11-28 05:43:18 25 4
gpt4 key购买 nike

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

我使用设计器来设计我的窗口。

假设主窗口有一个菜单,其中有一个名为“暂停”的选项。选择此选项时,将调用 MainWindow::on_actionSuspend_triggered() 方法,其简化实现可以恢复如下:

void MainWindow::on_actionSuspend_triggered()
{
SuspendDialog suspend_dialog(this);
suspend_dialog.setModal(true);
auto status = suspend_dialog.exec();
return;
}

SuspendDialog 是 designer 指定的,它派生自 QDialog 类并且非常简单(三个按钮,一个组合框和一个旋转框。这个类做不分配内存。

现在,当我在 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”的指针意味着您传递了负责释放那个小部件的父对象。或者,释放会发生两次:第一次是堆栈上的对象被销毁,第二次是父对象被销毁。

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

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

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

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

关于c++ - qt designer 指定的 QDialog 的 valgrind 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com