IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Crash dans le destructeur d'un QDialog


Sujet :

Qt

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut Crash dans le destructeur d'un QDialog
    Bonjour à tour,

    me revoilà avec un nouveau problème des plus étranges...
    Soient :
    1 classe héritant de QApplication app
    1 classe héritant de QObject AlertController
    1 classe héritant de QDialog AlertDialog

    l'instance de app contient un attribut alertController_ instancié sur la pile (dans les attributs)
    AlertController contient un attribut alertDialog_ instancié idem.

    app appelle alertController pour afficher une alerte.
    alertController prépare la dialog et l'affiche (show())

    si je quitte app alors que la dialog est ouverte j'ai le crash suivant (read access violation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    0	QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> >::data	qscopedpointer.h	135	0x6e1a55ca	
    1	qGetPtrHelper<QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> > >	qglobal.h	2428	0x6e193cbb	
    2	QApplication::d_func	qapplication.h	390	0x6e19e173	
    3	QWidget::~QWidget	qwidget.cpp	1629	0x6e22a88b	
    4	QDialog::~QDialog	qdialog.cpp	327	0x6e847cf8	
    5	AlertDialog::~AlertDialog	AlertDialog.cpp	45	0xd77b63	
    6	AlertsController::~AlertsController	AlertsController.cpp	16	0xd76e3e	
    7	AlertsController::`scalar deleting destructor'	A2		0xd7762f	
    8	QObjectPrivate::deleteChildren	qobject.cpp	1908	0x7091b1f9	
    9	QWidget::~QWidget	qwidget.cpp	1679	0x6e22a976	
    10	QMainWindow::~QMainWindow	qmainwindow.cpp	389	0x6e767d12	
    11	MainWindowController::~MainWindowController	MainWindowController.cpp	95	0xd81acd	
    12	MainAppController::~MainAppController	MainAppController.cpp	22	0xd71a23	
    13	MainAppController::`scalar deleting destructor'	A2		0xd733af	
    14	QObjectPrivate::deleteChildren	qobject.cpp	1908	0x7091b1f9	
    15	QObject::~QObject	qobject.cpp	929	0x70919cb8	
    16	QCoreApplication::~QCoreApplication	qcoreapplication.cpp	792	0x708fbc6d	
    17	QApplication::~QApplication	qapplication.cpp	1222	0x6e1afbcc	
    18	QtSingleApplication::~QtSingleApplication	A2		0xd3be10	
    19	A2Application::~A2Application	A2Application.cpp	50	0xd39e0a	
    20	Loader::loadApplication	Loader.cpp	37	0xd36257	
    21	main	main.cpp	67	0xd36082	
    22	WinMain	qtmain_win.cpp	131	0xdb68aa	
    23	__tmainCRTStartup	crtexe.c	547	0xdb5e50	
    24	WinMainCRTStartup	crtexe.c	371	0xdb5bdf	
    25	BaseThreadInitThunk	kernel32		0x75ba33aa	
    26	__RtlUserThreadStart	ntdll32		0x779a9ef2	
    27	_RtlUserThreadStart	ntdll32		0x779a9ec5
    Si le dialog n'est pas ouvert... je n'ai pas ce problème.
    Dans tous les cas suivants je n'ai pas le problème :
    -j'utilise un timer qui ferme le dialog au bout de 5s
    -je ferme le dialog à la main
    -je n'affiche pas le dialog mais l'instancie quand même

    Dans tous les cas suivants j'ai le problème :
    -je laisse le dialog ouvert (pas de timer)
    -je ferme l'application avant que le timer n'ait fermé le dialog

    Ca fait 2h que je suis là dessus et google n'est pas mon ami... Alors que faire selon vous ??

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonsoir,

    Votre problème ressemble au fait qu'une classe tente de libérer la mémoire de l'un de ses enfants qui a déjà préalablement été détruit. Ce genre de cas, en gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QObject *obj = new QObject(NULL);
    QObject *child = new QObject(obj);
    delete child;
    delete obj;
    Je ne serais pas contre le fait de voir le code.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    merci pour votre réponse. Malheureusement je ne fais pratiquement aucun delete, tous mes objets sont instanciés sur la pile ou bien ont un parent. A ce niveau du code le seul delete figure dans le destructeur du dialog et sert à supprimer l'UI instancié dans le constructeur par un new.

    le plantage survient sur la parenthèse fermante du destructeur du contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MainWindowController::~MainWindowController()
    {
        if(ui)
            delete ui;
    }

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonsoir,

    Dans ce cas, on peut peut-être chercher ailleurs : n'auriez-vous pas un widget respectant le pattern singleton comme ceci qui possèderait des enfants ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyWidget* MyWidget::get()
    {
        static MyWidget widget;
        return &widget;
    }
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyWidget& MyWidget::get()
    {
        static MyWidget widget;
        return widget;
    }
    Si vous n'avez rien de ce genre, une solution lente mais efficace serait de commenter progressivement le code de sorte de repérer le problème, en commençant par chercher du côté des timers et des initialisations.

    Bonne soirée,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    J'utilise en effet un template de Singleton qui renvoie une référence dans certains cas mais jamais avec un QObject ou un QWidget...

    Ce qui m'étonne particulièrement dans ce cas c'est que le crash ne survient que lorsque la fenêtre est visible, jamais lorsqu'elle n'est plus visible, timer ou pas...

    Il doit bien y avoir un rapport non ? Si je provoque un hide() dans le destructeur ça ne resoud pas non plus mon problème.

    Est-ce que ça vous évoque quelque chose en particulier ?

  6. #6
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    J'ai eu un problème de ce genre récemment, et c'était lié à la parenté des widgets (avec le singleton). Comme autre crash que je connais, c'est de faire un setCentralWidget() sur une QMainWindow avec un QWidget qui n'est pas le fils de la QMainWindow. À la fermeture du programme, on constate que ça ferme mal et que ça crashe au bout de quelques secondes. Votre problème concernant les QDialog, je doute que ça vienne de là, d'autant plus que vous ne semblez pas avoir le souci dans tous les cas.

    Avec les informations que j'ai, je ne pense pas pouvoir donner plus d'indications.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Merci beaucoup pour toutes ces pistes !
    Je vais regarder du côté du positionnement du dialog et des parents/enfants il doit bien y avoir un problème quelque part en.

    Salutations

Discussions similaires

  1. "gnome-keyboard-properties" crash dans Debian
    Par 00700 dans le forum Debian
    Réponses: 0
    Dernier message: 07/10/2007, 18h07
  2. variable globale dans le destructeur ?
    Par Valkirion dans le forum C++
    Réponses: 2
    Dernier message: 04/08/2007, 14h08
  3. Réponses: 7
    Dernier message: 10/03/2007, 11h08
  4. probleme de delete dans un destructeur
    Par Chewbi dans le forum C++
    Réponses: 6
    Dernier message: 12/03/2006, 00h29
  5. attraper un crash dans une fonction d'une bibliothèque
    Par JeromeCJU dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 10/03/2006, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo