16,831
社区成员




我在代码中保存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";
}
}
}
}
虽然你调用了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的所有引用都被释放。
希望回答对你有用