Fix focusproxy-relayed crash in QGraphicsItem destructor.
Makes tst_qgraphicsitem::tst_focusProxyDeletion not crash. valgrind reported the error when running tst_qgraphicsitem. The crash was very real; when deleting an item that has another item as a focus proxy, the proxy still had a reference to the deleted item's focusProxy pointer. I'm not a huge fan of whitebox testing but thought this crash justifies a modification of the test to make it fail, instead of just passing silently with a warning only given by valgrind and friends. FTR the reason the test doesn't crash hard is that the memory is freed but not reused within the scope of the test. So the access to the pointer d_ptr->focusProxy succeeds, it just accesses memory that might as well have been reclaimed. But this is quite undefined... Task-number: QTBUG-28321 Change-Id: I2624631f5e5c2a8aa8bd4efe1fc128eba6c61f56 Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
This commit is contained in:
parent
8c814db747
commit
ed15e4eb07
@ -1436,6 +1436,7 @@ QGraphicsItem::~QGraphicsItem()
|
||||
#endif
|
||||
|
||||
clearFocus();
|
||||
setFocusProxy(0);
|
||||
|
||||
// Update focus scope item ptr.
|
||||
QGraphicsItem *p = d_ptr->parent;
|
||||
|
@ -8485,7 +8485,9 @@ void tst_QGraphicsItem::focusProxyDeletion()
|
||||
|
||||
rect2 = new QGraphicsRectItem;
|
||||
rect->setFocusProxy(rect2);
|
||||
QGraphicsItem **danglingFocusProxyRef = &rect->d_ptr->focusProxy;
|
||||
delete rect; // don't crash
|
||||
QVERIFY(!rect2->d_ptr->focusProxyRefs.contains(danglingFocusProxyRef));
|
||||
|
||||
rect = new QGraphicsRectItem;
|
||||
rect->setFocusProxy(rect2);
|
||||
|
Loading…
Reference in New Issue
Block a user