2

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

QImage: out of memory, returning null image

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

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

注意:要创建图像,我正在使用 SO question how to convert an opencv cv::Mat to qimage的公认答案中描述的技术。

4

2 回答 2

1

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

Qt 中的许多 C++ 类使用隐式数据共享来最大化资源使用和最小化复制。当作为参数传递时,隐式共享类既安全又高效,因为只有指向数据的指针被传递,并且只有当函数写入数据时才会复制数据,即写时复制。

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

创建共享对象时,它会将引用计数设置为 1。每当新对象引用共享数据时,引用计数就会增加,而当对象取消引用共享数据时,引用计数就会减少。当引用计数变为零时,共享数据被删除。

隐式共享发生在幕后;程序员不需要担心它。

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

于 2013-02-13T08:12:25.093 回答
0

如有关隐式共享的文档中所述:

创建共享对象时,它会将引用计数设置为 1。每当新对象引用共享数据时,引用计数就会增加,而当对象取消引用共享数据时,引用计数就会减少。当引用计数变为零时,共享数据被删除。

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

于 2013-02-13T08:04:04.637 回答