Am Dienstag, 22. November 2005 15:14 begab es sich, daß Ludwig Fromke folgendes in den Rechenknecht kloppte:
Hallo Liste
Ich muß vorausschicken das ich gerade meine ersten Gehversuche mit Qt und C++ unter Suse Linux 9.3 mache. Die vorangegangene Diskusion (frage zu Objekten in c++) hat mir viel geholfen. Jetzt fehlt mir nur noch etwas zum richtigen Verständnis der Materie. In der Doku von QT unter QSqlCursor habe ich etwas gefunden was nicht richtig verstehe. (liegt wohl auch an meinen schlechten Englisch) Da steht das QT den Cursor nicht automatisch löscht sondern ich dafür verantwortlich bin. Ich stelle mir das jetzt einfach mal so vor: QSqlCursor *cursor = new QSqlCursor; delete cursor; (Hoffentlich stimmt das so)
So stimmt's erstmal.
Aber selbst in den Beispielen von Qt finde ich immer nur sowas: QSqlCursor cur( "prices" ); Eigentlich habe ich gedacht das sich solche Variablen von selbst töten wenn die Funktion beendet wird. (Stimmt das?) (Wie ist das eigentlich mit Variablen die ich im Konstruktor definiere? Wann sterben die?)
Du stehst in der Tat ziemlich am Anfang eines langen und faszinierenden Weges. Aber zu deiner Frage: Man kann Variabelen - vereinfacht ausgedrückt - auf zwei Arten deklarieren. Einmal auf dem Stack, das ist so, wie es in den Tutorials steht. Diese Variabelen werden automatisch gelöscht, wenn ihr Gültigkeitsbereich verlassen wird. Dieser geht - wieder vereinfacht ausgedrückt - von der der Deklaration voranstehenden {-Klammer bis zu der ihr zugehörigen Schliessklammer. Stack-Variabelen sind gut, wenn man "mal eben was wegschreiben" will. Diese Variabelen deklariert man daher auch nicht im Konstruktor, weil sie mit ihm gemeinschaftlich sterben. Für langlebige Variabelen nimm man den Heap. Deine erste Deklaration erzeugt ein solches Objekt. Dabei passieren mehrere Dinge: Zunächst deklarierst du einen Zeiger vom Typ QSqlCursor, das ist eine int-Variabele, in die eine Speicheradresse eingetragen wird. Dann initialisierst du diesen Zeiger, indem du ihm z.B. so wie du es gemacht hast, per new neuen Speicher reservierst. Weil du aber explizit Soeicher reserviert hast, must du diesen auch explizit wieder zurückgeben. Dafür sorgt der delete-Aufruf. Der Zeiger, den du zu Anfang deklariert hast, zeigt nun zwar immer noch auf den Speicherbereich, aber der gehört dir nun nicht mehr und könnte vom System einem anderen Prozess oder Thread zugewiesen werden.
Die Frage ist nun wie ich einen QSqlCursor richtig töte? Und gibt es noch mehr solche Qt-Objekte die ich selber töten muss?
Wie gesagt, es kommt drauf an, wie du ih deklarierst. Ich leg mir das Ding immer auf den Heap; weil ich ihn dann garantiert klassenweit verwenden kann. Auch habe ich mir angewöhnt, alle Objekte spätestens im Destruktor zu deleten, egal, was die Qt-Doku sagt. sicher ist sicher.
Da ich immer wieder bei meinen Dialogen, die viel mit SQL arbeiten, das Problem habe das beim zweiten Start ein SegFault kommt wäre ich für etwas Hilfe sehr dankbar.
Dann will ich mal hoffen, daß ich hilfreich sein konnte. -- --- Grüsse aus Meissen Jörg Pauly