在linux下QImage和QPixmap的内存泄漏和QPixmap线程安全问题
在linux下QImage和QPixmap的内存泄漏和QPixmap线程安全问题
为什么不在线程里面使用QPixmap(path),而是使用QPixmap::fromImage(QImage(path))或者类似的转换
这是由于QPixmap构建存在线程安全问题,我们相册和看图类的软件往往使用后台线程加载图片,而这个时候如果QPixmap(path)构建,在两个线程同时运行时,经常会出现崩溃的情况,所以QPixmap本身是存在线程安全问题的,所以我们不要在主线程以外的线程直接构建QPixmap,可以通过构建QImage转化为QPixmap来防止线程安全问题.QImage就不存在这个问题.
QPixmap和QImage在线程中都存在内存泄漏问题
在一个线程中构建了QPixmap或者QImage的对象或者指针,线程退出释放后,内存并没有得到释放,猜测是由于qt对图像缓存机制的问题.
我们设置最大线程池个数为3-10,得到的结果就是线程池最大数量越大,内存占用的越多,目前也并没有解决方法.
能释放大部分内存的方法
#include <malloc.h>
malloc_trim(0);
对空闲的堆空间进行释放,该函数能释放没有使用到的内存,效果显著,非常好用.
但是依然有部分内存没有被释放.
平台和版本
系统:UOSV20(LINUX) ,qt5.11.3
解决方案:
在main函数加上
#include <malloc.h>
main函数第一行加上
mallopt(M_ARENA_MAX,1);
在每一次清理空间的时候家还是那个malloc_trim(0);
linux的回收机制和空间分配机制并不友好,没有windows那么强大,所以见效分配堆块空间的分配,是一个不错的解决方案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具