为什么使用QtConcurrent在另一个线程中读取图像似乎会导致内存泄漏?

侏儒

我正在尝试实现与另一线程中请求的图像相邻的预加载图像,并将其存储在QPixmapCache中,但是即使我不存储图像,也似乎存在内存泄漏。

Valgrind用这种方法显示没有内存泄漏,但是即使我删除了将图像添加到QPixmapCache的代码,程序的内存也将超过500MB。如果将其添加到QPixmapCache,则内存使用量将超过1 GB。

我进行了测试,以确保正确删除了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;
}

我希望在另一个线程中读取图像后,内存使用不会显着增加,并且会随着时间的推移而减少。

如果需要更多信息,我很乐意提供。我已经为此困扰了几个星期。

侏儒

我提交了一个错误报告,并从这里的Qt开发人员那里获得了一些见识:https : //bugreports.qt.io/browse/QTBUG-73413

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么一个代码会产生内存泄漏,而另一个却不会呢?

ImageView,如何设置图像似乎出现在另一个图像的前面?

为什么指向同一个内存的多个共享指针会导致内存泄漏?

是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

在递归函数中调用另一个函数会导致错误。为什么?

为什么在另一个线程中循环处理大量数据会导致GC活动过度,并阻止释放某些数据?

内存泄漏-如何为在另一个结构中作为线程参数传递的Typdef结构分配内存?

为什么使用 make_unique<> 将函数传递给线程会导致 Valgrind 中的内存泄漏?

如何使用共享内存在一个线程中修改值并在另一个线程中读取值?

为什么在另一个头文件中声明结构会导致LNK2001错误?

包含另一个 Makefile 会导致构建失败,为什么?

从qt中的另一个线程运行qtconcurrent时如何关闭程序

在另一个类或无头片段中使用Asynctask还会导致内存泄漏吗?

为什么一个二维数组会导致段错误,而另一个不会?

为什么使用“ new”会导致内存泄漏?

为什么JpaRepositories似乎使用另一个事务?

从C ++中的另一个线程读取指针

在另一个线程中读取变量

Python从另一个线程启动/停止线程会导致意外行为

为什么一个空集与另一个集的并集会导致python中的一个空集?

为什么在一个函数中似乎拒绝了“使用”,而在另一个函数中却可以呢?

为什么引发ActiveRecord :: Rollback不会删除在另一个线程中创建的记录

为什么我的回调消息在另一个线程中执行?

为什么一个变量的值似乎覆盖了另一个?

为什么我的Java程序会忽略另一个html中的List?

为什么在另一个快照隔离事务中插入带有外键引用pk修改的行的外键会导致该事务挂起?

为什么一个分支中的更改会影响git中的另一个分支?

为什么更改一个输入中的值也会更改另一个输入中的值?

为什么可以从另一个程序读取app.config中的加密数据