我的应用程序将网络摄像头图像传输到QWidget
,然后在显示后不再需要这些图像。应用程序运行大约一两分钟后再发出此错误数十次并崩溃:
QImage: out of memory, returning null image
QWidget
使用displayImage(QImage)
方法,每秒调用几次。我感觉图像应该以指针作为参数,但我没有理由支持它。
如何确保从内存中释放QImage
?
注意:要创建图片,我正在使用SO问题how to convert an opencv cv::Mat to qimage的接受答案中描述的技术。
答案 0 :(得分:1)
QImage类使用隐式数据共享。摘自doc:
Qt中的许多C ++类使用隐式数据共享来最大化资源 使用和最小化复制。隐式共享类是安全的 当作为参数传递时效率很高,因为只有一个指针 传递数据,仅在a和a时复制数据 函数写入它,即copy-on-write。
共享类由指向共享数据块的指针组成 包含引用计数和数据。
创建共享对象时,会将引用计数设置为1 每当新对象引用时,引用计数就会递增 共享数据,并在对象解除引用共享时递减 数据。当引用计数变为时,将删除共享数据 零。强>
隐含共享发生在幕后;程序员呢 不用担心。
这意味着如果您通过值将QImage对象传递给displayImage(),那么将创建一个新的QImage,但第一个QImage中的图像数据将不会重复,但只会增加共享引用计数器。但这也意味着如果你想释放你的第一个QImage对象分配的内存,那么你需要确保两个QImage对象超出范围。
答案 1 :(得分:0)
正如docs中关于隐式共享所述:
创建共享对象时,它将引用计数设置为1 每当新对象引用时,引用计数就会递增 共享数据,并在对象解除引用共享时递减 数据。当引用计数变为时,将删除共享数据 零。
这意味着您必须在代码中的某处引用QImage
个框架。