Bonjour,
J'ai un segmentation fault à l'appel de la méthode quit() de mon QApplication personnalisé.
Voici un exemple minimaliste qui le reproduit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int main(int argc, char *argv[]) { CApplication a(argc, argv); return a.exec(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 CApplication::CApplication(int& argc, char** argv) : QApplication(argc, argv) { pModule = new Module(this); // QApplication est parent du module }Voici la pile :
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 Module::Module(QObject *parent) : QObject(parent) { w = new MainWindow(); w->show(); } Module::~Module() { if (w) { delete w; // Seg fault ici w = NULL; } }
J'ai trouvé une solution qui consiste à appeler un méthode pour détruire le module sur un signal aboutToQuit() de l'application :0 Module::~Module module.cpp 13 0x4024dd
1 Module::~Module module.cpp 18 0x402565
2 QObjectPrivate::deleteChildren qobject.cpp 1841 0x6b942187
3 QObject::~QObject qobject.cpp 934 0x6b940b49
4 QCoreApplication::~QCoreApplication qcoreapplication.cpp 754 0x6b91b7c5
5 QGuiApplication::~QGuiApplication qguiapplication.cpp 499 0x2108c6d
6 QApplication::~QApplication qapplication.cpp 685 0x9996797
7 CApplication::~CApplication capplication.h 8 0x409332
8 qMain main.cpp 6 0x401625
9 WinMain@16 qtmain_win.cpp 131 0x403e7d
10 main 0x40a5fd
Ce qui m'ennuie, c'est que je ne sais pas bien l'expliquer..
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 CApplication::CApplication(int& argc, char** argv) : QApplication(argc, argv) { pModule = new Module(this); QObject::connect(this, SIGNAL(aboutToQuit()), this, SLOT(clean())); } void CApplication::clean() { if (pModule) { delete pModule; pModule = NULL; } }
Une idée ? :-)
Merci!
Partager