Я пытаюсь реализовать предварительную загрузку изображений рядом с тем, что запрашивается в другом потоке, и сохраняю их в QPixmapCache, но даже если я не сохраняю изображения, кажется, что есть утечка памяти.
Valgrind не показывает утечек памяти при использовании этого метода, но объем памяти программы превысит 500 МБ, даже если я удалю код, добавляющий изображения в QPixmapCache.Если он добавлен в QPixmapCache, использование памяти превышает гигабайт.
Я проверил, чтобы убедиться, что FutureWatcher удалялся правильно, и, действительно, при удаленном вызове deleteLater память просачивается намного быстрееи Valgrind обнаруживает утечку.
QFutureWatcher<QVImageAndFileInfo> *cacheFutureWatcher = new QFutureWatcher<QVImageAndFileInfo>();
connect(cacheFutureWatcher, &QFutureWatcher<QVImageAndFileInfo>::finished, [cacheFutureWatcher, this](){
addToCache(cacheFutureWatcher->result());
cacheFutureWatcher->deleteLater();
});
cacheFutureWatcher->setFuture(QtConcurrent::run(this, &QVImageCore::readFile, filePath));
И вот что запускается в readFile:
QVImageCore::QVImageAndFileInfo QVImageCore::readFile(const QString fileName)
{
QVImageAndFileInfo combinedInfo;
QImageReader newImageReader;
newImageReader.setDecideFormatFromContent(true);
newImageReader.setAutoTransform(true);
newImageReader.setFileName(fileName);
const QImage readImage = newImageReader.read();
combinedInfo.readFileInfo = QFileInfo(fileName);
if (readImage.isNull())
{
emit readError(QString::number(newImageReader.error()) + ": " + newImageReader.errorString(), fileName);
currentFileDetails = lastFileDetails;
emit fileInfoUpdated();
return combinedInfo;
}
combinedInfo.readImage = readImage;
return combinedInfo;
}
Я ожидаю, что использование памяти не увеличится так сильно после чтения изображений в другоми уменьшаться со временем.
Если потребуется дополнительная информация, я с радостью предоставлю.Я был озадачен этим неделями.