-
Bug
-
Resolution: Fixed
-
P1: Critical
-
5.14.2, 5.15.0
When creating an object with Component.createObject, then connecting to a signal on it and destroying it, qml will leak QQmlContext objects over time. Here's a minimal example:
import QtQuick 2.11
Item {
id: root
signal outer
Component {
id: comp
Item {
signal inner
}
}
Timer{
repeat: true
interval: 50
running: true
onTriggered: {
let obj = comp.createObject(root);
root.outer.connect(obj.inner)
//WORKAROUND
//root.outer.disconnect(obj.inner)
obj.destroy()
gc()
}
}
//"Objects are not destroyed
//the instant destroy() is called, but are cleaned up sometime between the end
//of that script block and the next frame (unless you specified a non-zero
//delay)."
/*Component.onCompleted: {
while (true) {
let obj = comp.createObject(root);
root.outer.connect(obj.inner)
obj.destroy()
gc()
}
}*/
}
The signal to signal connection prevents the object from cleanup. Either disconnect should happen automatically or the documentation should mention, that disconnect is needed.
- depends on
-
QTBUG-88248 QObject orphaned connections soft-leak
-
- Closed
-
- relates to
-
QTBUG-88587 QQuickWidget object stay in QML Engine cache after deletion
-
- Closed
-