qt设计器指定的QDialog的valgrind问题
valgrind issue with QDialog specified with qt designer
我正在用qt-creator开发一个简单的原型。
我用了designer来设计我的窗户。
假设主窗口有一个菜单,其中包含一个名为"挂起"的选项。当选择该选项时,它被称为方法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设计器自动生成的。
我的问题是:这是勇气的错误肯定,还是我做错了什么?
提前感谢
通过以下操作,您是在找麻烦:
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
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 额外分配valgrind
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- Valgrind:可以处理更多可能丢失的字节吗?
- 如何在程序执行时查看Valgrind Massif输出(或其他堆分析器)?
- 自定义对话框(源自QDialog)不会关闭(Android)
- C++/Qt Valgrind 未初始化的字节
- 在 valgrind c++ 上读取大小 8 无效
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- Valgrind 在 std::string::swap 中报告 SIGILL
- Valgrind 大小为 8 且地址 0x5b7e520 的读取无效,在大小为 16 的块内为 0 字节 free'd
- 重载 new 和 delete 会导致 valgrind 错误
- Valgrind 在 QThread::start() 上报告内存泄漏
- 我可以让 valgrind 告诉我 _哪个_值未初始化吗?
- QDialog 不能在 Windows 上退出,但在 MacOS 上不能退出/
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- Valgrind 在 std::make_unique 中显示内存泄漏
- 为什么 valgrind 报告两个内存分配,而我的代码只请求一个?
- 如何将Valgrind与Qt Creator一起使用来调试远程应用程序?
- qt设计器指定的QDialog的valgrind问题