Ich habe kürzlich exit code 255
in meiner Qt 5.7 Anwendung erlebt. Dies passierte direkt nachdem ich meine benutzerdefinierte QGestureRecognizer
hinzugefügt hatte. Ich habe in den Quellen des Qt debuggt und bin zu dem Schluss gekommen, dass die QGestureManager
automatisch alle QGestureRecognizer
Instanzen entsorgt. Die Linie, die das Problem verursacht, ist im Inneren des destructor von Widget, wo die Erkennungs erstellt und registriert:QGestureRecognizer wird automatisch von QGestureManager zerstört?
Demo::~Demo() {
// delete other stuff
delete recognizer;
}
Die Sache ist QGestureRecognizer
unterstützt nicht (zumindest nach der Dokumentation und an den Konstruktor der Unterschrift suchen) Die parent-child
-Beziehung in Qt, da sie nicht von QObject
(oder einer Unterklasse dieser fundamentalen Qt-Klasse) abgeleitet ist. Dies bedeutet, dass man dem Konstruktor nicht zuweisen kann, daher ist QCustomGestureRecognizer recognizer = new QCustomGestureRecognizer (this)
nicht möglich. Wenn man diesen Gedanken weiterführt, bedeutet dies, dass man den Destruktor durch Aufruf von delete recognizer
manuell auslösen muss. Oder so dachte ich ...
Am Ende der Lebensdauer meiner Anwendung wird die QGestureManager
genannt. Dort gibt es eine Liste von Erkennern namens m_recognizers
. Es enthält eine Reihe von integrierten Erkennern (wie die für die Tap
Geste) zusammen mit dem registrierten benutzerdefinierten Erkenner (in meinem Fall wurde es als 257
registriert). Der Destruktor von QGestureManager
durchläuft die Liste und löscht ihre Einträge.
Wenn die delete recognizer
Linie vorhanden ist, bekomme ich einen Segmentation Fault, wenn qDeleteAll(...)
(für die m_recognizers
) erreicht den Eintrag des benutzerdefinierten Erkennungs da es versucht, etwas zu löschen, die bereits gelöscht wurde.
Nachdem ich die Zeile delete recognizer
im Destruktor meines Widgets auskommentiert habe, stehe ich nicht mehr vor dem Problem, aber ich bin immer noch unsicher, ob ich meinen Code nicht irgendwo knacke. Der Exit-Code ist nicht (wie erwartet) ein 0
, aber die Informationen darüber, wie Recognizer entsorgt werden, fehlen vollständig in der offiziellen Dokumentation.
Hat jemand dieses Problem festgestellt? Ich schließe die Möglichkeit nicht aus, dass das Problem von einem anderen Teil meines Codes herrührt, obwohl es ziemlich unwahrscheinlich erscheint, wenn man bedenkt, dass es erscheint, wenn der Standard-Destruktor QWidget
aufgerufen wird. Gemäß C++ - Standard wird beim Erben einer Klasse zuerst der Destruktor der Unterklasse aufgerufen (in meinem Fall ist dies das benutzerdefinierte Widget Demo
- dort gibt es keine Probleme) und dann die Basisklasse.
Danke. Das habe ich mir schon gedacht: P Immer noch schön zu sehen, dass es in der Dokumentation tatsächlich erwähnt wird. – rbaleksandar