Qt C++ 中总是需要删除内存吗?

Memory is delete always needed in Qt C++?

我已经使用并修改了下面的示例代码:

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); 
} 
}

它是简单 'sketch system' 的一部分。我觉得奇怪的是指针:

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. In which case, addItem() 取得 myPath 的所有权,并在需要时 delete 它。

只要您已将 QGraphicsPathItem 的所有权传递给某个其他对象,您就不必删除它,但到那时您对内存负责。注意未调用 addItem() 的代码路径,因为您可能需要调用 delete。比如抛出异常。

这种模式有点过时,但在基于场景图的图形框架中仍然很常见。