释放不需要的Q图像

Releasing unneeded QImages

本文关键字:图像 不需要 释放      更新时间:2023-10-16

我的应用程序将网络摄像头图像流式传输到QWidget,然后在显示这些图像后就不需要这些图像了。应用程序运行大约一两分钟,然后出现几十次错误并崩溃:

QImage: out of memory, returning null image

QWidget使用每秒调用多次的displayImage(QImage)方法。我觉得图像应该以指针作为参数,但我没有理由支持这一点。

如何确保QImage从内存中释放?

注意:为了创建图像,我正在使用SO问题的公认答案中描述的技术——如何将opencv cv::Mat转换为qimage。

QImage类使用隐式数据共享。文件摘录:

Qt中的许多C++类使用隐式数据共享来最大化资源使用并尽量减少复制。隐含共享类都是安全的并且在作为参数传递时是有效的,因为只有指向数据被传递,并且只有当函数写入,即写时复制。

共享类由指向共享数据块的指针组成包含引用计数和数据。

创建共享对象时,会将引用计数设置为1。这个每当新对象引用共享数据,并在对象取消引用共享数据时递减数据当引用计数变为零

隐性分享发生在幕后;程序员会无需担心。

这意味着,如果您将一个QImage对象按值传递到displayImage()中,那么将创建一个新的QImage,但第一个QImage中的图像数据不会重复,而是只会增加一个共享参考计数器。但这也意味着,如果你想释放你分配的第一个QImage对象的内存,那么你需要确保两个QImage都超出了范围。

如文档中关于隐式共享的说明:

创建共享对象时,会将引用计数设置为1。这个每当新对象引用共享数据,并在对象取消引用共享数据时递减数据当引用计数变为零

这意味着您必须在代码中的某个位置引用QImage帧。