在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那么强大,所以见效分配堆块空间的分配,是一个不错的解决方案。

posted @ 2022-03-03 20:06  dependon  阅读(935)  评论(0编辑  收藏  举报