Qt窗口关闭时如何释放内存?
Posted
技术标签:
【中文标题】Qt窗口关闭时如何释放内存?【英文标题】:How to deallocate memory when a Qt window closes? 【发布时间】:2010-10-14 20:57:49 【问题描述】:我目前正在 Qt、OpenCv、Mac os X 中创建一个程序。我有一个主窗口,然后打开了一个单独的窗口。我在构造函数中向新窗口传递了几个矩阵克隆:
ImageWindow *imageWin = new ImageWindow(
cvCloneMat(getData->getMasterRawMat(1)),
cvCloneMat(getData->getMasterRawMat(2)),
cvCloneMat(getData->getMasterRawMat(3)),
cvCloneMat(getData->getMasterRawMat(4)) );
imageWin->show();
当新窗口关闭时,我如何解除分配(我在哪里调用 cvReleaseMat)?
【问题讨论】:
【参考方案1】:你可以这样做,例如你的closeEvent()。或者,如果您将Qt::WA_DeleteOnClose 用于您的widget attributes,小部件将在关闭时被删除,这意味着您可以在析构函数中放置一些清理例程。
【讨论】:
评论:确保您正确地将您的“ImageWindow *imageWin”作为父级。 QT 中适当的养育对内存管理很重要:) 是否将`Qt::WA_DeleteOnClose` 标志添加到QWidget
足以当用户通过按下关闭按钮关闭它时,其关联的内存被释放?我将它初始化为QTableWidget *w = new QTableWidget();
..【参考方案2】:
考虑使用RAII idiom 和smart pointers,您无需记住何时释放分配的内存。
【讨论】:
关闭窗口是 != 删除窗口。智能指针在这里没有帮助。 在当前情况下,如果在 closeEvent() 中释放数据并且稍后重用窗口,则当您尝试访问克隆矩阵时将会出现 UB,因为它们是在窗口构造函数中分配的。在构造函数中分配的东西在 99% 的情况下都应该在析构函数中删除,包括这个。 我想说的是,问题是关于如何在关闭窗口时触发破坏。这不是关于如何使破坏本身更容易或更聪明或其他什么。 我同意,我的回答不是对具体问题的直接回答。但我想说的是“学会正确管理数据,你就不需要问这样的问题了”:)以上是关于Qt窗口关闭时如何释放内存?的主要内容,如果未能解决你的问题,请参考以下文章