使用 QPixmap 的 Qt 内存泄漏

2023-12-28

我在这段代码中的某个地方遇到了奇怪的内存泄漏。该方法是连接到另一个线程中的方法的 SLOT。它做了两件事: 1 它用另一个线程所在的迭代更新文本框。 2 它将 GUI 上显示的图像更新为与该迭代相对应的图像。

它在 10-30 次迭代中效果很好,然后就崩溃了。在任务管理器中观察其内存使用情况,我可以看到它一开始很稳定,然后每次迭代都会增加 RAM 使用量约 10%。我可以做什么来消除泄漏?

Transition::Transition(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Transition)

    {
    ui->setupUi(this);
    this->files = files;
    imageObject = new QImage();
    scene = new QGraphicsScene(this);
}

Transition::~Transition()
{
    delete ui;
    delete imageObject;
    delete scene;
}

有问题的插槽:

void Transition::onCounterChanged(QString counter){
    ui->imageCounter->setText(counter);
    foldername = ui ->folderName->toPlainText();
    int m = counter.toInt();
    QString filename = files[m];
    imageObject->load(filename);
    image = QPixmap::fromImage(*imageObject);

    scene->clear();//THIS FIXES THE LEAK

    scene->addPixmap(image);
    ui->picDisplay->setScene(scene);
    ui->picDisplay->fitInView(image.rect(),Qt::IgnoreAspectRatio);
}

我认为您不只是简单地更新图像,而是使用以下命令为场景创建新的像素图项目:

void Transition::onCounterChanged(QString counter)
{
    [..]
    imageObject->load(filename);
    image = QPixmap::fromImage(*imageObject);
    scene->addPixmap(image); // <----- Adds new pixmap item to the scene
    [..]
}

因此,经过 10-30 次迭代后,场景中就会有 10-30 个像素图项。我认为,你必须更新现有的QGraphicsPixmapItem using QGraphicsPixmapItem::setPixmap()函数,而不是在每次迭代时创建一个新函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 QPixmap 的 Qt 内存泄漏 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • iPhone / iPad IOS 应用程序仪器内存计数与 task_info 内存计数

    我一直在使用 Instruments Leak Tester 它给出了大约 1 3 meg 的应用程序总分配数字 但是 当使用 task info 时 它会报告更大的内存量 例如 10 20 meg 我想我只是想确认task info正在返
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 本地管理的广播接收器泄漏?

    当应用程序被系统杀死时 本地 即使用 LocalBroadcastManager 管理 BroadcastReceiver 是否有可能泄漏 我需要它的具体用例是我想在活动的 onCreate onDestroy 中注册 注销 Broadca
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐