释放不需要的QImages

时间:2013-02-13 03:53:23

标签: c++ qt memory

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

QImage: out of memory, returning null image

QWidget使用displayImage(QImage)方法,每秒调用几次。我感觉图像应该以指针作为参数,但我没有理由支持它。

如何确保从内存中释放QImage

注意:要创建图片,我正在使用SO问题how to convert an opencv cv::Mat to qimage的接受答案中描述的技术。

2 个答案:

答案 0 :(得分:1)

QImage类使用隐式数据共享。摘自doc

  

Qt中的许多C ++类使用隐式数据共享来最大化资源   使用和最小化复制。隐式共享类是安全的   当作为参数传递时效率很高,因为只有一个指针   传递数据,仅在a和a时复制数据   函数写入它,即copy-on-write。

     

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

     

创建共享对象时,会将引用计数设置为1   每当新对象引用时,引用计数就会递增   共享数据,并在对象解除引用共享时递减   数据。当引用计数变为时,将删除共享数据   零。

     

隐含共享发生在幕后;程序员呢   不用担心。

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

答案 1 :(得分:0)

正如docs中关于隐式共享所述:

  

创建共享对象时,它将引用计数设置为1   每当新对象引用时,引用计数就会递增   共享数据,并在对象解除引用共享时递减   数据。当引用计数变为时,将删除共享数据   零。

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