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
。比如抛出异常。
这种模式有点过时,但在基于场景图的图形框架中仍然很常见。
我已经使用并修改了下面的示例代码:
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
。比如抛出异常。
这种模式有点过时,但在基于场景图的图形框架中仍然很常见。