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

Alles rund um die Programmierung mit Qt
Antworten
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

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

Beitrag 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
Zuletzt geändert von kleineSchildy am 19. Dezember 2007 09:02, insgesamt 1-mal geändert.
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag 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 ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

erstens hat's da nirgends eine Schleife....

zweitens muessen Variabeln vor dem ersten Lesezugriff initialisiert werden...
Korgen
Beiträge: 42
Registriert: 28. März 2006 16:37

Beitrag 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;

}
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

das wars. Sowohl die Sache mit "delete" als auch mit dem Initialisieren. Vielen Dank für eure Hilfe.

Viele Grüße
Jana
Antworten