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
}
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;
  }
}
Voici la pile :
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
J'ai trouvé une solution qui consiste à appeler un méthode pour détruire le module sur un signal aboutToQuit() de l'application :
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;
  }
}
Ce qui m'ennuie, c'est que je ne sais pas bien l'expliquer..

Une idée ? :-)

Merci!