[gelöst] Segmentation error durch WA_DeleteOnClose

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

[gelöst] Segmentation error durch WA_DeleteOnClose

Beitrag von qtNiko »

hi,

ich habe seit einiger Zeit auf meinem openSuse10.2 jedesmal, wenn ich mein Qt-Programm beende, einen Segmentation error. Ich hatte bereits in diesem Forum um Rat gefragt und alles mögliche ausprobiert, aber der Fehler blieb. Im Debug-Mode wird ein Fehler bei free... gemeldet. Eine Forum-Antwort damals war, dass möglicherweise irgendwo ein Speicher freigegeben werden soll, der bereits freigegeben ist. Die Debugger-Meldung deutet auch darauf hin, aber ich konnte nichts finden. Ein Versuch, mit dem Debugger durchzusteppen, führte mich tief in die Qt-Bibliotheken hinein, wo ich aufgab, weil ich mich da nicht auskenne.

Jetzt habe ich etwas gefunden, um den Fehler zu vermeiden, verstehe aber nicht, warum das so ist.

Ich habe ein QMainWindow, in dessen Constructor gleich nach dem setupUi(this) ein WA_DeleteOnClose kommt:

Code: Alles auswählen

SimDesign::SimDesign(QMainWindow *parent) : QMainWindow(parent)
{
	setupUi(this);

	setAttribute(Qt::WA_DeleteOnClose, true);
...
	
Wenn ich im Constructor nichts weiter mache, als die hier gezeigten Zeilen, und ich beende das Programm, dann tritt der Fehler Segmentation error auf. Da ich die GUI mit dem Qt-Designer erstellt habe, und alles dafür Notwendige automatisch erzeugt wird, kann somit der Fehler nicht in meinem eigenen Code liegen.

Wenn ich allerdings die Zeile setAttribute(....) auskommentiere, dann tritt die Fehlermeldung nicht auf.

Kann mir jemand erklären, warum diese Zeile hier einen Fehler erzeugt und wann ein WA_DeleteOnClose überhaupt erlaubt ist?
Zuletzt geändert von qtNiko am 14. Februar 2010 01:08, insgesamt 1-mal geändert.
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie instanziierst du die Klasse? Doch hoffentlich per new und nicht auf dem Stack, oder?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Beitrag von qtNiko »

Das Instantiieren erfolgt im main(), das automatisch beim Erzeugen des Qt-Projekts erzeugt wird (Qt-Integration in Eclipse).
Das main() sieht so aus:

Code: Alles auswählen

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
    SimDesign simWindow;
    simWindow.show();
     
    return app.exec();
}
Bedeutet dies, dass das Hauptobjekt auf dem Stack erzeugt wird?
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Sieht wohl so aus... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Beitrag von qtNiko »

wow,

das gibt mir Hoffnung, dass ich damit noch einen weiteren Fehler beseitigen kann, der nach Stacküberlauf aussieht.

Ich habe dem Automatismus von Qt-Integration blind vertraut und mir keine Gedanken darüber gemacht, wie die Instantiierung erfolgt. Es hat ja schließlich funktioniert - bis auf solche Kleinigkeiten :wink:

Danke
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Beitrag von qtNiko »

tja, durch das Instantiieren mit "new" ist der Fehler weg, aber warum das so ist, ist mir dennoch nicht klar.
Die Methode, auf dem Stack zu instantiieren, ist doch nicht verboten, oder?
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn du es auf den Stack erzeugst wird es auch wieder gelöscht sobald du diese Funktion verlässt. Und danach wird es versucht nocheinmal zu löschen. Wie soll das gehen?

-> C++ Grundlagen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

Beitrag von qtNiko »

Danke, das leuchtet ein: wieder etwas gelernt :)
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
Antworten