我已经使用并修改了以下示例代码:
void MyScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
myPath = new QGraphicsPathItem();
previous = event->scenePos();
QPainterPath p;
p.moveTo(previous);
myPath->setPath(p);
this->addItem(myPath);
}
void MyScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if(myPath)
{
QPainterPath path = myPath->path();
previous = event->scenePos();
path.lineTo(previous);
myPath->setPath(path);
}
}
它是简单的“草图系统”的一部分。我发现奇怪的是,该指针:
QGraphicsPathItem *myPath;
不采用构造函数或不允许:
myPath = new QGraphicsPathItem(this); // this code will fail - why?
我以为这将有助于清理/删除指针。为什么这不会泄漏内存?还是呢?我在QTCreator中使用过Valgrind,它似乎没有显示任何内存泄漏。我应该在某个位置吗:
delete(myPath); // is this needed?
任何人都可以在QT内具体解释或指出何时需要删除的简要说明。我正在研究QPointer和QSharedPointer,可能是更好的方法。
我发现Valgrind很难在QTCreator创建的应用程序的命令行上使用,因为它似乎与正在创建的GUI对象混淆,并吐出了数百行。在QTCreator中,我用简单的情况测试了valgrind,它只指向正确的行,没有别的了-容易得多。没有上面的行:
delete(myPath); // is this needed?
Valgrind似乎没有显示内存泄漏。为什么?
我可以从QtCreator中信任Valgrind多少?
最佳答案
我不是Qt专家,但我认为MyScene
继承自QGraphicsScene。在这种情况下,addItem()拥有myPath
的所有权,并在需要时将其delete
所有权。
只要将QGraphicsPathItem
的所有权传递给其他对象,就不必删除它,但是到那时为止,您要对内存负责。当心未调用addItem()
的代码路径,因为这可能需要调用delete
。例如,如果引发异常。
这种模式有些过时,但在基于场景图的图形框架中仍然很常见。