清理QList和QGraphicsScene以避免内存泄漏

时间:2015-05-27 22:35:22

标签: c++ qt pointers qgraphicsscene qlist

我希望彻底清理以避免内存和对象泄漏。

我误以为Qt会自动清除超出范围的对象,除非需要手动删除指针。

在我的代码中,我有一些QList ...示例:

void someFunction()
{
    QList<int> x = QList<int>() << 0 << 0 << 0 << 0;
    QList<QImage> y; // filled in some way
    QList<QGraphicsScene*> s;

    s = otherFunction(x, y);
}

QList<QGraphicsScene*> otherFunction(QList<int>& x, const QList<QImage>& y)
{
    QList<QGraphicsScene*> s; 
    s.push_back(this->scene());  // a few times; of course there is some processing...
    return s;
}

void thirdFunction()
{
    QList<int> x = QList<int>() << 0 << 0 << 0 << 0;
    QList<QImage> y; // filled in some way
    QList<QGraphicsScene*> s;

    s = otherFunction(x, y);
    for (int i = 0; i < s.size(); ++i)
    {
        view[i]->setScene(s.at(i)); // view is a QList<QGraphicsView*>
    }
}

多次调用,我可以看到内存增加(从任务管理器看到)。

显然,当项目超出范围时,它们不会被删除......我立即怀疑场景指针列表。

1)删除它们的最佳方法是什么?将

qDeleteAll(s);
someFunction()中的

是否足够?它会删除场景指针,以及场景中的所有QGraphicItems吗?或者我是否需要遍历场景列表,并删除所有项目?我必须这样做:

    for (int i = 0; i < s.size(); ++i)
    {
        s.at(i).clear();
    } // then
    qDeleteAll(s);

2)我是否需要删除简单变量列表(intbool)?
那些对象列表呢,比如QImage

3)我假设从场景中删除一个项目会删除它的指针。但现在我读到了,从场景中删除一个项目后,需要手动删除它。

也是如此
scene().clear();

删除已添加到场景中的QGraphicItem指针?或者是否应使用delete电话删除项目?

4)thirdFunction中,我是否有内存泄漏?好像我这样做!!
我无法删除场景,因为我将它们设置到视图上......但是已经分配给视图的场景会发生什么?
我该如何正确清理?

1 个答案:

答案 0 :(得分:2)

<强> 1 qDeleteAll使用C ++ delete运算符删除容器中的项目。它还在Qt文档中说明了QGraphicsScene析构函数:

  

在销毁之前删除并删除场景对象中的所有项目   场景对象

这样就可以拨打qDeleteAll(s)

<强> 2 删除列表时,无需删除基本或Qt类型的列表,如QList<int>QList<QImage>

第3 QGraphicsScene::clear()删除并删除场景中的所有项目。所以调用scene().clear();就足够了。这等同于致电:

qDeletaAll( scene()->items() );

<强> 4 由于视图不占用场景,因此您应使用deleteLater()

删除先前分配的场景
for (int i = 0; i < s.size(); ++i)
{
    view[i]->scene()->deleteLater();
    view[i]->setScene(s.at(i)); // view is a QList<QGraphicsView*>
}