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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教关于QT中内存释放的问题相关的知识,希望对你有一定的参考价值。

参考技术A 我通过 new BYTE[szSize]的方式创建了struct指针,然后把它们加入QList,当整个对象释放的时候,再遍历QList逐一delete指针,但是每次释放到第2个指针对象时均报以下错误:
HEAP[xxx.exe]: Invalid address specified to RtlValidateHeap( 000000FD6A3E0000, 000000FD7367C330 )

Qt窗口关闭时如何释放内存?

【中文标题】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窗口关闭时如何释放内存?

关于WPF中Image控件不释放内存的问题

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

关于java内存释放的问题

qt程序断电后内存能释放么

如何释放内存?