我有一段代码,我使用过Qt的新动画框架。我只需要在那段代码中使用动画,我不需要在其他地方使用动画相关的变量。显然,如果动画在动画完成之前被销毁,动画将无效。例如,以下内容不起作用:
if (animate)
{
QPropertyAnimation animation(_piece_images[svg_index].getImage(), "pos");
animation.setDuration(200);
animation.setEndValue(getCellPos(row, col));
animation.setEasingCurve(QEasingCurve::InOutSine);
animation.start();
}
所以我使用指针动画:
if (animate)
{
QPropertyAnimation *animation = new
QPropertyAnimation(_piece_images[svg_index].getImage(), "pos");
animation->setDuration(200);
animation->setEndValue(getCellPos(row, col));
animation->setEasingCurve(QEasingCurve::InOutSine);
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
我的问题是,上述解决方案中是否有任何内存泄漏?请尽可能提供参考,可能是我错过了什么。
答案 0 :(得分:4)
通过将QAbstractAnimation::DeleteWhenStopped
传递给start()方法,只要您允许动画运行完成,手动调用stop()或在某些时候显式调用delete,就应该覆盖它。虽然如果你的循环计数是-1(无限),那么你必须手动调用stop()或delete。
DeletionPolicy parameter to start()的文档使我明白我认为需要它。但是你当然可以放入一些调试代码来检查并确保在你认为应该调用析构函数时调用它。
此外,定期运行Valgrind或其他泄密检查员也不会有什么坏处。很高兴能早日养成这种习惯!
更新:如果你对一个对象如何能够“删除它”感到好奇,那就是有一种叫做QObject::deleteLater()的东西。它将删除排队,以便在下次运行事件循环时发生。如果你对Qt例程的机制感到好奇,不要害怕去查看源代码......通常很清楚:
http://qt.gitorious.org/qt/qt/blobs/HEAD/src/corelib/animation/qabstractanimation.cpp#line599