J'ai récemment rencontré exit code 255
dans mon application Qt 5.7. Cela est arrivé juste après que j'ai ajouté ma coutume QGestureRecognizer
. J'ai débogué dans les sources du Qt et j'en suis arrivé à la conclusion que le QGestureManager
dispose automatiquement de toutes les instances QGestureRecognizer
. La ligne qui provoque le problème est à l'intérieur du destructor widget où le reconnaisseur est créé et enregistré:QGestureRecognizer automatiquement détruit par QGestureManager?
Demo::~Demo() {
// delete other stuff
delete recognizer;
}
La chose est QGestureRecognizer
ne supporte pas (au moins en fonction de la documentation et en regardant la signature du constructeur) la relation parent-child
dans Qt car elle n'est pas dérivée de QObject
(ou de toute sous-classe de cette classe Qt fondamentale). Cela signifie que l'on ne peut pas affecter un parent
au constructeur its, donc QCustomGestureRecognizer recognizer = new QCustomGestureRecognizer (this)
n'est pas possible. Poursuivant cette ligne de pensée, cela signifie que l'on doit déclencher manuellement le destructeur en appelant le delete recognizer
. Ou alors je pensais ...
À la fin de la vie de mon application, le QGestureManager
est appelé. Dans là il y a une liste de reconnaisseurs appelés m_recognizers
. Il contient un tas de reconnaisseurs intégrés (comme celui pour le geste Tap
) ainsi que le système de reconnaissance personnalisé enregistré (dans mon cas, il était enregistré sous le numéro 257
). Le destructeur de QGestureManager
itère dans la liste et supprime ses entrées.
Lorsque la ligne delete recognizer
est présent je reçois une erreur de segmentation lors qDeleteAll(...)
(pour le m_recognizers
) atteint l'entrée de la reconnaissance personnalisée, car il tente de supprimer quelque chose qui a déjà été supprimé. Après avoir commenté la ligne delete recognizer
dans le destructeur de mon widget, je ne suis plus confronté au problème mais je ne sais toujours pas si je ne romps pas mon code quelque part. Le code de sortie n'est pas (comme prévu) un 0
mais les informations sur la façon dont les reconnaisseurs sont éliminés sont complètement manquantes dans la documentation officielle.
Est-ce que quelqu'un a rencontré ce problème? Je n'exclus pas la possibilité que le problème provienne d'une autre partie de mon code, bien qu'il semble assez improbable étant donné qu'il apparaît lorsque le destructeur QWidget
par défaut est appelé. Conformément à la norme C++ lors de l'héritage d'une classe, le destructeur de la sous-classe est appelé (dans mon cas, il s'agit du widget personnalisé Demo
- aucun problème), puis de la classe de base.
Merci. Je me suis dit que: P C'est toujours agréable de voir que c'est mentionné dans la documentation. – rbaleksandar