Crash bei Pointer-Kopie in Singleton
Verfasst: 31. August 2007 15:26
... hoert sich seltsam an.. ist es aber auch:
Folgende Anwendung:
* eine Source-File: main.cc
* darin deklariert (und definiert) :
1. eine Singleton-Klasse, welche einen QWidget* speichert
2. eine von QApplication-abgeleitete, eigene "MyApp"
Der ganze Kram crashed in genau einem Fall:
1. appli muss vom Typ "MyAppli" sein,
2. Pointer "mainConsole" muss in einer Singleton-Klasse gespeichert werden.
Ist eine der beiden Bedingungen nicht erfuellt (z.B. appli vom Typ "QApplication" oder mainConsole in einer "normalen" Klasseninstanz gespeichert) funktioniert das Programm problemlos..
Reproduziert mit Qt 4.3.1, Linux, g++-4.1
comments? hints?
Folgende Anwendung:
* eine Source-File: main.cc
* darin deklariert (und definiert) :
1. eine Singleton-Klasse, welche einen QWidget* speichert
2. eine von QApplication-abgeleitete, eigene "MyApp"
Code: Alles auswählen
#include <QtCore>
#include <QtGui>
/*===========================================================================*\
** Class Singl (Test-Singleton)
\*===========================================================================*/
class Singl
{
public:
static Singl *Instance();
void setWin(QWidget *w);
private:
Singl();
QWidget *mWin;
static Singl *mInst;
};
Singl *Singl::mInst = NULL;
Singl *Singl::Instance()
{
if (!mInst)
mInst = new Singl();
return mInst;
}
void Singl::setWin(QWidget *w)
{
mWin = w;
}
Singl::Singl() {}
/*===========================================================================*\
** Class MyAppli (Test-Applikation)
\*===========================================================================*/
class MyAppli : public QApplication
{
public:
MyAppli(int argc, char *argv[]);
};
MyAppli::MyAppli(int argc, char *argv[])
: QApplication(argc, argv)
{
}
/*===========================================================================*\
** main
\*===========================================================================*/
int main(int argc, char *argv[])
{
// QApplication appli(argc,argv); // alles geht gut
MyAppli appli(argc,argv); // crash bei appli.exec()
QWidget *mainConsole = new QWidget();
mainConsole->show();
Singl::Instance()->setWin(mainConsole);
return appli.exec();
}
1. appli muss vom Typ "MyAppli" sein,
2. Pointer "mainConsole" muss in einer Singleton-Klasse gespeichert werden.
Ist eine der beiden Bedingungen nicht erfuellt (z.B. appli vom Typ "QApplication" oder mainConsole in einer "normalen" Klasseninstanz gespeichert) funktioniert das Programm problemlos..
Reproduziert mit Qt 4.3.1, Linux, g++-4.1
comments? hints?