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

时间:2015-03-05 20:32:22

标签: c++ qt memory-leaks

我使用并修改了以下示例代码:

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多少钱?

1 个答案:

答案 0 :(得分:1)

我不是Qt的专家,但我认为MyScene继承自QGraphicsScene。在这种情况下,addItem()取得myPath的所有权,并在需要时delete

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

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