Seite 1 von 1

[gelöst] Segmentation error durch WA_DeleteOnClose

Verfasst: 12. Februar 2010 13:48
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?

Verfasst: 12. Februar 2010 14:19
von Christian81
Wie instanziierst du die Klasse? Doch hoffentlich per new und nicht auf dem Stack, oder?

Verfasst: 12. Februar 2010 22:05
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?

Verfasst: 12. Februar 2010 22:47
von Christian81
Sieht wohl so aus... :roll:

Verfasst: 13. Februar 2010 00:07
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

Verfasst: 14. Februar 2010 01:10
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?

Verfasst: 14. Februar 2010 09:36
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

Verfasst: 15. Februar 2010 21:33
von qtNiko
Danke, das leuchtet ein: wieder etwas gelernt :)