【问题标题】:Qt memory management. What's wrong?Qt 内存管理。怎么了?
【发布时间】:2010-10-05 16:38:13
【问题描述】:

我有一个关于 Qt 内存泄漏的问题。

我有一个带有 2 个 QPushButtons 的 QMainWindow。

第一个按钮点击信号:

m_label = new QLabel(this);

QPixmap pix(this->size());
QPainter painter;
painter.begin(&pix);

QImage img("1.png");
painter.drawPixmap(this->rect(), QPixmap::fromImage(img));
m_label->setPixmap(pix);

painter.end();

第二个按钮点击信号:

delete m_label;

当我启动我的测试应用程序时,分配的内存大约是 11900 Kb 当我单击第一个按钮时,为应用程序分配的内存约为 12450 Kb 当我点击第二个按钮时,我分配了大约 12250 Kb 的内存

为什么我没有得到相同的 11900 Kb?这是泄漏吗?

所以如果要写如下代码:

QImage img("1.png");
QImage img1("1.png");
QImage img2("1.png");
QImage img3("1.png");
QImage img4("1.png");
QImage img5("1.png");
QImage img6("1.png");
QImage img7("1.png");
QImage img8("1.png");
QImage img9("1.png");

然后分配的内存会增长但不会减少。为什么?如何清理这个内存泄漏?

【问题讨论】:

  • 你是如何测量内存消耗的?
  • ...在 img...img9 的情况下,您预计它什么时候会减少? (但一般测量问题更相关)

标签: qt


【解决方案1】:
  1. 在第一次调用 QImage img("1.png") 之后,Qt 加载图像格式插件,并在使用后保持加载(出于性能问题)。所以剩下的部分内存来自加载的插件,这不是泄漏。
  2. 你在哪里分配那些 QImages (img...img9 case)?您确定它们超出了范围吗?
  3. 请记住,操作系统并不总是在您的软件释放内存后立即保留它。

【讨论】:

  • 另外,我认为 Qt 缓存了一些数据,以及许多由创建对象触发的内存结构通常只会增长,而不是经常收缩(如子列表对象,例如)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2011-01-30
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多