Hi,
ich wollte in einem größeren Programm das Erstellen von mehreren gleichartigen Widgets durch eine Widgetfactory lösen, leider kommt es dabei zu einem Speicherzugriffsfehler, den ich mir nicht erklären kann: (Ist eine kleine Beispielapp, der Fehler dürfte aber der gleiche sein)
Code:
#include <qwidget.h>
#include <qstringlist.h>
#include <qvbox.h>
#include <qpushbutton.h>
#include <qapplication.h>
class Factory
{
public:
QStringList keys() const { return QStringList() << "QPushButton"; }
QWidget* create(const QString & key, QWidget* parent = 0, const char* name = 0)
{
if(key == "QPushButton")
return new QPushButton("PushButton",parent, name);
return 0;
}
};
class MainWindow : public QVBox
{
public:
MainWindow();
};
MainWindow::MainWindow() : QVBox(0)
{
Factory* factory = new Factory();
for(QStringList::Iterator it = factory->keys().begin(); it != factory->keys().end(); ++it)
factory->create(*it, this);
delete factory;
}
int main(int argc, char** argv)
{
QApplication app(argc, argv);
MainWindow mw;
app.setMainWidget(&mw);
mw.show();
return app.exec();
}
Dabei kommt es zu folgenden merkwürdigen Fehlern:
Starting program: /home/axel/Documents/factory
[New Thread 16384 (LWP 2653)]
Code:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 16384 (LWP 2653)]
0x4050c95e in operator==(QString const&, char const*) ()
from /usr/lib/qt3/lib/libqt-mt.so.3
Current language: auto; currently c
(gdb) bt
#0 0x4050c95e in operator==(QString const&, char const*) ()
from /usr/lib/qt3/lib/libqt-mt.so.3
#1 0x40012780 in environ () from /lib/ld-linux.so.2
#2 0x0804b802 in MainWindow (this=0xbffff510) at factory.cpp:31
#3 0x0804b889 in main (argc=1, argv=0xbffff654) at factory.cpp:39
#4 0x407827f7 in __libc_start_main () from /lib/i686/libc.so.6
(gdb)
In meinem großen Programm hab ich noch lustigere Sachen entdeckt, unter anderem Segfaults in QMotifStyle, was ich noch nie angefasst habe
Lesezeichen