[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ß
    Marcel

    ps.: 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 🙂


Anmelden zum Antworten