Seite 1 von 1

[gelöst] Objekt scheint zu existieren, obwohl noch nicht...

Verfasst: 18. Dezember 2007 14:37
von kleineSchildy
Hallo,

im meiner Header-Datei habe ich den Pointer auf eine GroupBox

Code: Alles auswählen

private:
    QGroupBox*    srcTopSigmaGroupBox;
meine Funktion sieht jetzt folgendermaßen aus

Code: Alles auswählen

void MyChild::createGroupBoxTophatSigma(QString type){
	 
	//existierende GroupBox löschen
	if(srcTopSigmaGroupBox){
	    qDebug("Sigma existiert schon und muss gelöscht werden.");
        srcTopMainLayout->removeWidget(srcTopSigmaGroupBox);
        srcTopSigmaGroupBox->~QGroupBox();
    }
    
	srcTopMainLayout->setSizeConstraint(QLayout::SetNoConstraint);
	setMinimumSize(0, 0);
	
    srcTopSigmaGroupBox = new QGroupBox(tr("Sigma"));
	    
    srcTopMainLayout->addWidget(srcTopSigmaGroupBox);
	srcTopMainLayout->setSizeConstraint(QLayout::SetDefaultConstraint);	 
}
Es soll geprüft werden, ob die GroupBox schon existiert und in gegeben Fall gelöscht werden. Wenn ich nur remove mache, erscheint sie leider trotzdem im Hintergrund, deswegen möchte ich sie komplett zerstören.

Diese GroupBox existiert am Anfang nicht und wurd zur Laufzeit eingefügt. Beim aller ersten Start des Fensters kann das Objekt also überhaupt nicht existieren und trotzdem geht er in die Schleife rein. Es kommt zum Absturz, weil er ja ein Objekt zerstören will, was garnicht existiert.

So denk ich mir das jedenfalls.

Meine Frage ist jetzt, was veranlasst mein Programm dazu, die Schleife zu betreten :shock:

Danke für eure Hilfe.

Viele Grüße
Jana

Verfasst: 18. Dezember 2007 15:16
von VuuRWerK

Code: Alles auswählen

srcTopSigmaGroupBox->~QGroupBox();
Da fehlen uns wohl noch ein paar C++ Grundlagen, was? ;) Den Destruktor ruft man nie selber auf, das macht der Compiler. Daher müsste da folgendes stehen:

Code: Alles auswählen

delete srcTopSigmaGroupBox;
Und natürlich müsste man, um sie erneut zu initialisieren noch folgendes hin:

Code: Alles auswählen

srcTopSigmaGroupBox = new QGroupBox();
Gut Schuß
VuuRWerK ;)

Verfasst: 18. Dezember 2007 15:21
von solarix
erstens hat's da nirgends eine Schleife....

zweitens muessen Variabeln vor dem ersten Lesezugriff initialisiert werden...

Verfasst: 19. Dezember 2007 07:40
von Korgen
Hi
wie solarix schon sagt, musst du den Pointer im Konstruktor mit 0 initialisieren, sonst zeigt er irgendwohin, wo du natürlich nicht zugreifen darfst.

also:

Code: Alles auswählen

MyChild::MyChild(...) {

srcTopSigmaGroupBox = 0;

}

Verfasst: 19. Dezember 2007 09:01
von kleineSchildy
das wars. Sowohl die Sache mit "delete" als auch mit dem Initialisieren. Vielen Dank für eure Hilfe.

Viele Grüße
Jana