Qt使用QPixmap存在内存泄漏

1.现象:

软件界面中存在多个条目,点击条目可以进行切换查看;切换到某个条目时,会计算该条目的数据,并在界面上显示为图像。在持续不断的切换过程中,内存一直在增加,出现内存泄漏的现象。

2.分析:

查找所有New的地方,从切换条目时从硬盘加载数据,到计算以及显示过程中所对应的New都有delete。切换过程中会首先清除以前的图像,然后再加载当前条目的图像数据,也就是QPixmap。但在清除图像 delete Qpixmap时,所对应的内存并没有释放,随着条目切换, 内存就一直增加。

通过分析发现:显示UI的固定的界面元素,即在切换条目时显示UI的元素即QWidget的子类,定义为QWidgetA并没有销毁,该在QWidgetA中声明了QPixmap的成员变量m_Pixmap,在显示条目所对应的图像时,将图像数据对应的QPixmap赋值给了m_Pixmap。查看QPixmap的源码如下:

QPixmap &QPixmap::operator=(const QPixmap &pixmap)
{
    if (paintingActive()) {
        qWarning("QPixmap::operator=: Cannot assign to pixmap during painting");
        return *this;
    }
    if (pixmap.paintingActive()) {                // make a deep copy
        pixmap.copy().swap(*this);
    } else {
        data = pixmap.data;
    }
    return *this;
}

赋值过程中,是将数据直接拷贝,为浅拷贝。但是该data的类型为QExplicitlysharedDataPointer,为隐式共享类指针类型,拷贝过程中会将引用计算增加,所以只要引用计数不为0 ,在QPixmap所对应的内存就不会被释放,从而出现内存泄漏的问题。

3.解决办法:

去除m_pixmap去除即可,显示图像时将QPixmap直接通过UI控件进行SetPixmap即可。

注:Qpixmap是GUI类,在加载数据时用QImage比较好。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值