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 :

[Qt GUI] Crash à la fermeture de l'application


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut [Qt GUI] Crash à la fermeture de l'application
    Bonjour,

    J'ai développé une application qui fonctionne correctement mais qui crashe lors de la fermeture.

    Je l'ai réduite au minimum pour faire des tests mais rien n'y fait.
    La conf minimum consiste en un QMainWindow auquel j'ajoute une statusBar perso.
    Cette classe est appelé par un singleton.

    A la fermeture de la fenêtre principale j'ai :
    Exeption levée : violation d'accès en lecture
    this a été 0xFFFFFFFFFFFFFFFF.

    Là je cale, j'ai essayé d'analyser la pile d'appel mais en vain
    ça plante sur la ligne 114 du ficher qlist.h alors que je n'ai pas de QList !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline bool isEmpty() const Q_DECL_NOTHROW { return d->end  == d->begin; }
    Si quelqu'un peut m'aider, merci d'avance

    Je vous met le code utilisé
    le .h
    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
     
    #ifndef STATUSBAR_H
    #define STATUSBAR_H
     
    #include <QStatusBar>
     
    class StatusBar : public QStatusBar {
     
    	Q_OBJECT
     
    public:
    	static StatusBar* getInstance(QWidget *parent);
     
    private:
    	StatusBar(QWidget *parent);
    	~StatusBar();
     
    	static StatusBar* m_Instance;
    	bool m_bInstance = true;
    };
     
    #endif
    le cpp
    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
     
    #include "StatusBar.h"
     
    StatusBar* StatusBar::m_Instance = (StatusBar*)Q_NULLPTR;
     
    StatusBar* StatusBar::getInstance(QWidget *parent) {
    	if (m_Instance == (StatusBar*)Q_NULLPTR) {
    		m_Instance = new StatusBar(parent);
    	}
    	return m_Instance;
    }
     
     
    StatusBar::StatusBar(QWidget *parent) : QStatusBar(parent) {
    	qDebug("Je passe par le constructeur");
     
    	setStyleSheet("background-color: green; color: white");
    	showMessage("La barre de status est bien présente.");
     
    }
     
    StatusBar::~StatusBar() {
    	if (m_bInstance) {
    		m_bInstance = false;
    		delete m_Instance;
    	}
    }
    Le MainTest.h
    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
     
    #ifndef MAINTEST_H
    #define MAINTEST_H
     
    #include <QtWidgets/QMainWindow>
    #include "ui_MainTest.h"
    #include "StatusBar.h"
     
    class MainTest : public QMainWindow
    {
    	Q_OBJECT
     
    public:
    	MainTest(QWidget *parent = Q_NULLPTR);
    	~MainTest();
     
    private:
    	Ui::MainTestClass* ui;
    	StatusBar* m_StatusBar;
    };
     
    #endif
    le MainTest.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "MainTest.h"
     
    MainTest::MainTest(QWidget *parent) : QMainWindow(parent), ui( new Ui::MainTestClass() ) {
     
    	ui->setupUi(this);
     
    	m_StatusBar = StatusBar::getInstance(parent);
    	setStatusBar(m_StatusBar);
    }
     
    MainTest::~MainTest() {
    	delete ui;
    }
    et enfin de main.cpp classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "MainTest.h"
    #include <QtWidgets/QApplication>
     
    int main(int argc, char *argv[])
    {
    	QApplication a(argc, argv);
    	MainTest w;
    	w.show();
    	return a.exec();
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 902
    Points : 219 982
    Points
    219 982
    Billets dans le blog
    126
    Par défaut
    Bonjour,

    La pile d'appel peut tracer de nombreux appels dans le code de Qt (et autres), donc, il faut la remonter afin de retrouver le dernier appel lié à votre code.
    Cela nous aiderai mieux, si vous pouviez copier l'intégralité de la pile d'appels, du coup.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Merci de m'aider

    Voici la pile d'appel


    > Qt5Cored.dll!QListData::isEmpty() Ligne 108 C++
    Qt5Widgetsd.dll!QList<QStatusBarPrivate::SBItem * __ptr64>::isEmpty() Ligne 185 C++
    Qt5Widgetsd.dll!QStatusBar::~QStatusBar() Ligne 245 C++
    MainTest.exe!StatusBar::~StatusBar() Ligne 26 C++
    [Code externe]
    Qt5Cored.dll!QObjectPrivate::deleteChildren() Ligne 1963 C++
    Qt5Widgetsd.dll!QWidget::~QWidget() Ligne 1683 C++
    Qt5Widgetsd.dll!QMainWindow::~QMainWindow() Ligne 392 C++
    MainTest.exe!MainTest::~MainTest() Ligne 16 C++
    MainTest.exe!main(int argc, char * * argv) Ligne 9 C++
    MainTest.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) Ligne 123 C++
    [Code externe]
    La ligne 26 du StatusBar.cpp est la parenthèse de sortie de destructeur.
    Je ne sais pas trop quoi en déduire.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 902
    Points : 219 982
    Points
    219 982
    Billets dans le blog
    126
    Par défaut
    Je pense que le problème provient du Singleton. En effet, Qt va tenter de détruire la barre des status de lui même (car ça fait partie de ces objets, voir la documentation Qt sur la GodClass (QObject)) et qu'au final, vous l'avez détruite avant lui.
    Qui plus est, je ne vois pas pourquoi vous avez besoin d'un Singleton.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    J'ai enlevé le "delete m_Instance" du destructeur de la StatusBar.
    Et effectivement ça ne plante plus.

    Qt va détruire la QStatusBar mais qu'en est il de StatusBar ?

    Je me pose donc une question, ne va t'on pas avoir une fuite mémoire ?
    On est entrain de fermer l'appli ce ne devrait pas poser de soucis, sauf si on le fait plein de fois

    En réponse à votre question, je me suis dis que dans une application, il n'y a qu'une seule StatusBar donc un singleton me paraissait judicieux surtout que je dois y accéder de multiple endroit de l'application.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 902
    Points : 219 982
    Points
    219 982
    Billets dans le blog
    126
    Par défaut
    Votre StatusBar, héritant de QStatusBar sera détruit par Qt (car il hérite d'un objet Qt). Comme je vous l'ai indiqué, il faut lire la documentation .

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    OK Merci,

    Je vais me lire la doc bien que j'ai du mal avec l'anglais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mon application crashe à la fermeture sur Mac
    Par michelblh52 dans le forum Qt
    Réponses: 2
    Dernier message: 06/10/2011, 21h22
  2. Mysql et fermeture de l'application
    Par fredero dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/05/2005, 20h16
  3. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28
  4. Problème de fermeture de l'application
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 02h06
  5. bouton ENTER = fermeture de l'application
    Par bigboomshakala dans le forum MFC
    Réponses: 2
    Dernier message: 10/05/2004, 11h14

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