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窗口关闭时如何释放内存?的主要内容,如果未能解决你的问题,请参考以下文章

Qt窗口及控件-窗口Close()自动释放

释放内存时,qt窗口会黑屏

请教关于QT中内存释放的问题

Mac Cocoa:无法释放窗口以取回其内存

如果关闭 fun() 后所有内存都被释放,那么输出如何打印 [重复]

内存未释放 - PyQt4