Segfault In ~QGraphicsItem() Due To Duplicate Transforms
-
I think the following causes (or can cause) a core:
@
QList<QGraphicsTransform*> transforms;
QGraphicsRotation* rot = new QGraphicsRotation();
transforms.append(rot);
transforms.append(rot);
graphicsitem->setTransformations(transforms);
@I am guessing that ~QGraphicsItem() does this and double frees:
@
QList<QGraphicsTransform*> transforms = this->transformations();
foreach ( QGraphicsTransform* transform, transforms ) {
delete transform;
}
@Please delete this if it's stupid.
-
It looks as if you are correct.
However, in my opinion this is not bug in the lib. You are handling the lib wrong. I cannot imagine a reason why you would define exactly the same transformation twice.See the example:
@
QList<QGraphicsTransform*> transforms;
QGraphicsRotation* rot = new QGraphicsRotation();
rot->setAngle ( 10 );
transforms.append(rot);
rot->setAngle ( 100 );
transforms.append(rot);
graphicsitem->setTransformations(transforms);
@
One could try to rotate by 10 and by 100 degrees, but it will rotate by 200 degrees. So it may happen of course, but it is an flaw in the design. -
You're correct in regard with the QGraphicsItemDestructor.
src/gui/graphicsview/qgraphicsitem.cpp - line 1489ff:
@
if (d_ptr->transformData) {
for(int i = 0; i < d_ptr->transformData->graphicsTransforms.size(); ++i) {
QGraphicsTransform *t = d_ptr->transformData->graphicsTransforms.at(i);
static_cast<QGraphicsTransformPrivate *>(t->d_ptr.data())->item = 0;
delete t;
}
}
@So yes, you run into double deletion of a pointer.