我希望彻底清理以避免内存和对象泄漏。
我误以为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)我是否需要删除简单变量列表(int
,bool
)?
那些对象列表呢,比如QImage
?
3)我假设从场景中删除一个项目会删除它的指针。但现在我读到了,从场景中删除一个项目后,需要手动删除它。
也是如此scene().clear();
删除已添加到场景中的QGraphicItem
指针?或者是否应使用delete
电话删除项目?
4)在thirdFunction
中,我是否有内存泄漏?好像我这样做!!
我无法删除场景,因为我将它们设置到视图上......但是已经分配给视图的场景会发生什么?
我该如何正确清理?
答案 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*>
}