[Gelöst] Crash wenn Widgets Membervariablen einer Klasse sind.
-
Hi!
Warum funktioniert das hier
class MainFrame : public QFrame { public: MainFrame(QWidget * parent = 0, Qt::WindowFlags f = 0); ~MainFrame (); private: // layout QGridLayout *m_layout; // tabs QTabWidget *m_tabwidget; // tabs widgets QWidget *m_tab1; QWidget *m_tab2; };
MainFrame::MainFrame(QWidget * parent, Qt::WindowFlags f) : QFrame(parent,f), m_layout(NULL), m_tab1(NULL), m_tab2(NULL), m_tabwidget(NULL) { m_layout = new QGridLayout(); m_tabwidget = new QTabWidget(); m_tab1 = new QWidget(); m_tab2 = new QWidget(); m_tabwidget->addTab(m_tab1,"Tab1"); m_tabwidget->addTab(m_tab2,"Tab2"); m_layout->addWidget(m_tabwidget); m_layout->setContentsMargins(2,2,2,2); this->setLayout(m_layout); this->show(); } CCAdminMainFrame::~CCAdminMainFrame() { if(m_tabwidget!=NULL) delete m_tabwidget; if(m_tab1!=NULL) delete m_tab1; if(m_tab2!=NULL) delete m_tab2; if(m_layout!=NULL) delete m_layout; }
einwandfrei, aber
class MainFrame : public QFrame { public: MainFrame(QWidget * parent = 0, Qt::WindowFlags f = 0); ~MainFrame (); private: // layout QGridLayout m_layout; // tabs QTabWidget m_tabwidget; // tabs widgets QWidget m_tab1; QWidget m_tab2; };
MainFrame::MainFrame(QWidget * parent, Qt::WindowFlags f) : QFrame(parent,f) { m_tabwidget.addTab(&m_tab1,"Tab1"); m_tabwidget.addTab(&m_tab2,"Tab2"); m_layout.addWidget(&m_tabwidget); m_layout.setContentsMargins(2,2,2,2); this->setLayout(&m_layout); this->show(); } CCAdminMainFrame::~CCAdminMainFrame() { }
stürzt brutal mit einer zugriffsverletzung ab...
Also was ich nur machen wollte ist die pointer zu normalen variablen umzuschreiben. Leider scheint es da aber Probleme zu geben.
Lustigerweise funktioniert das aber mit manchen meiner Klassen dennoch.Woran liegt das? Oder müsste das grundlegend immer gehen und ich mache irgendwas anderes falsch?
Gruß
Marcelps.: die sinnlosigkeit des QFrames bitte ich zu entschuldigen, dass ist nur der veranschaulichung so. und natürlich ist der QFrame selbst auch in einer anderen klasse als membervariable eingebunden, falls das einen unterschied macht.
-
um es so zu sagen: du machst etwas grundlegendes falsch.
der fehler liegt darin, dass du kinder eines qobject selber verwalten willst. das machen qobjects aber von alleine und erwarten, dass alle ihre kinder durch ein delete zerstörbar sind. mit dem addWidget()+setLayout() führst du ein reparent durch und weist alle widgets, die unterfester sind, dem hauptfenster als kinder zu. die warnhinweise findest du in der doku von QObject::QObject() und QObject::~QObject().das zusammengefasst: 1. kinder von qobjects müssen zeiger sein 2. sie dürfen nicht von hand zerstört werden, auch nicht von dem standard-dtor deiner klasse, sondern nur von den dtor des QObject.
-
ghorst schrieb:
um es so zu sagen: du machst etwas grundlegendes falsch.
der fehler liegt darin, dass du kinder eines qobject selber verwalten willst. das machen qobjects aber von alleine und erwarten, dass alle ihre kinder durch ein delete zerstörbar sind. mit dem addWidget()+setLayout() führst du ein reparent durch und weist alle widgets, die unterfester sind, dem hauptfenster als kinder zu. die warnhinweise findest du in der doku von QObject::QObject() und QObject::~QObject().das zusammengefasst: 1. kinder von qobjects müssen zeiger sein 2. sie dürfen nicht von hand zerstört werden, auch nicht von dem standard-dtor deiner klasse, sondern nur von den dtor des QObject.
wie recht du hast! danke