qimage占用内存不释放

wxf54318 2023-04-25 14:20:49

我在代码中保存PNG图片1,会占用1倍图片内存,然后加载PNG图片2,会占用两倍图片的内存,直到加载完毕

才会释放这两倍内存。我明明执行了m_image = QImage();了,好像m_image 的内存没有及时释放。

void saveimage()//保存PNG图片1
{
 QImageWriter writer(imgPath, "png");//保存已存在图片1
    if (!writer.write(m_image))
    {
        QString msg = QString("write image %1 failed ").arg(m_imgPath) + writer.errorString();
        QLOG_ERROR() << msg;
        qDebug() << msg;
    }
}

void loadimage()//加载PNG图片2
{
saveimage();
QImageReader reader;
    if (IsFileExist(imagePath))//如果图片2存在则加载图片2
    {
        m_image = QImage();//释放m_image的内存
        reader.setFileName(imagePath);
        reader.setDecideFormatFromContent(true);
        if(reader.canRead())
        {
            if(reader.read(&m_image))
            {
                qDebug() << "Read successfully";
            }
        }
   }
}

...全文
1810 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-04-25
精选
  • 打赏
  • 举报
回复 2
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/7933331, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态
阿尔法斗士 2023-04-25
  • 打赏
  • 举报
回复 2

虽然你调用了m_image = QImage()来释放m_image的内存,但这并不会立即释放内存。

这是因为QImage使用隐式共享(implicit sharing)技术,所以只有当所有指向该QImage对象的引用计数为零时,才会真正释放内存。

在你的代码中,保存图片1后,m_image对象已经没有任何引用指向它,所以其引用计数为0,因此它可能会释放内存。但在加载PNG图片2时,你又重新给m_image分配了一块内存,并将reader.read(&m_image)的结果赋值给它,这意味着现在m_image又有一个引用指向它,其引用计数变为1,所以在读取完图片2之前,m_image的内存是不能被释放的。只有当对m_image的所有引用(包括reader.read返回的引用)都被销毁时,m_image的引用计数才会归零,从而使其内存得以释放。

要避免这个问题,你可以在调用loadimage()方法之前调用m_image.detach(),以确保m_image不与其他任何引用共享内存空间。或者你可以在执行reader.read(&m_image)之前使用一个临时变量来保存reader.read的结果,并在该函数结束时将该变量销毁,以确保在该函数结束时,对m_image的所有引用都被释放。

希望回答对你有用

wxf54318 2023-05-26
  • 举报
回复
@阿尔法斗士 之前使用一个临时变量来保存reader.read是可以的,但是不能和loadimage放到一个函数中。用m_image.detach()是创建一个拷贝不起作用

16,831

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧