I’ve a block of code where I’ve used Qt’s new animation framework. I needed the animation just in that block of code and I don’t need the animation related variables in other places. Clearly, the animation won’t work if it is destroyed before the animation completed. For example, the following doesn’t work:
if (animate)
{
QPropertyAnimation animation(_piece_images[svg_index].getImage(), "pos");
animation.setDuration(200);
animation.setEndValue(getCellPos(row, col));
animation.setEasingCurve(QEasingCurve::InOutSine);
animation.start();
}
So I’m using animation using pointer:
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);
}
My question is, is there any memory leak in the above solution? Please provide reference if possible, probably I’ve missed something.
By passing in
QAbstractAnimation::DeleteWhenStoppedto the start() method, you should be covered so long as you allow the animation to run to completion, manually call stop(), or explicitly call delete at some point. Though if your loop count is -1 (infinite) then you must make the manual call to stop() or delete.The documentation for the DeletionPolicy parameter to start() makes this as explicit as I’d think one would need. But you can certainly put some debug code in to check and make sure the destructor gets called when you think it should.
Moreover, it couldn’t hurt to regularly run Valgrind or another leak-checker. Good to get in the habit sooner rather than later!
UPDATE: If you’re curious as to how an object is able to “delete this”, the trick is that there’s something called QObject::deleteLater(). It queues the deletion so that it happens the next time the event loop runs. If you’re ever curious about the mechanics of a Qt routine, don’t be afraid to go look at the source… it’s usually very clear:
http://qt.gitorious.org/qt/qt/blobs/HEAD/src/corelib/animation/qabstractanimation.cpp#line599