释放不需要的Q图像
Releasing unneeded QImages
我的应用程序将网络摄像头图像流式传输到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
帧。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么python需要全局关键字而C/C++不需要?
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 为什么在开始绘制获取的交换链图像时不需要内存障碍?
- 图像分割 - 删除C 中不需要的像素
- 我的加载图像不起作用 - 我需要知道为什么
- 释放不需要的Q图像