2016-08-03 24 views
0

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.

Antwort

1

Wenn Sie

Qt::GestureType QGestureRecognizer::registerRecognizer(QGestureRecognizer *recognizer) 

das System nutzen, übernimmt das Eigentum an dem Objekt und Sie sollten es sich nicht löschen.

Auszug aus der Dokumentation:

Die Anwendung übernimmt den Besitz des Erkenners und gibt die Typen ID Geste mit ihm verbunden ist.

+0

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