tags:

views:

280

answers:

1

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.

+2  A: 

By passing in QAbstractAnimation::DeleteWhenStopped to 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/master/src/corelib/animation/qabstractanimation.cpp#line405

Hostile Fork
I'm just confused even if I pass QAbstractAnimation::DeleteWhenStopped to start(), how the animation variable delete itself? Does it call delete this; kind of something? I use Qt Creator for developing GUI apps on Windows and looking for a good free memory leak detector for that platform. Can't use Valgrind.
Donotalo
It uses QObject::deleteLater(). Answer updated to mention that.
Hostile Fork
Ok that's good. Didn't know about deleteLater(). Thanks.
Donotalo