Re: Wie töte ich QSQLCursor

Jörg Pauly <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>
Am Dienstag, 22. November 2005 15:45 begab es sich, daß adsci folgendes in den 
Rechenknecht kloppte:
> Hey, du sprichst genau mein grösstes Rätsel an.
>
> Wie arbeiten Profis mit C/C++ Bibliotheken? Ohne perfekte Doku kann man
> ja nie sagen, wann welches Objekt noch lebt, bzw. wie lange ein
> zurückgegebener Zeiger noch auf reservierten Speicher zeigt.
>
> Generell denke ich, dass es folgendermaßen ist:
>
> Alle "normalen" Variablen werden auf dem Stack angelegt und gelten exakt
> so lange wie die äusseren { } - Klammern darum sind. Gibt es da Ausnahmen?

Nein!

> Alle new Speicherbereiche werden auf dem Heap angelegt und sind daher
> bis zum delete erreichbar (solange man nicht die Adresse verschlampt).
>
> Von daher ist Dein Cursor (ich hab keine Ahnung von QT) wenn er so
> deklariert wird:
>
> QSqlCursor cur( "prices" );
>
> am Ende auch wieder tot. Automatisch.
> Was allerdings sein kann ist, dass das QSqlCursor Objekt Speicher
> allokiert, der nicht in dessen Destructor gelöscht wird. Warum das so
> ist und was es in Deinem Fall ist weiss ich nicht.

Die Qt-Klassen sind IMHO so gut optimiert, daß sie keine Leaks produzieren. 
Allerdings besagt die Qt-Doku, daß alle Objekte, die von QObject, also der 
Stammklasse dieser Bibliothek, abgeleitet sind, ihre Kind-Objekte (das wird 
bei der Initialisierung festgelegt) auch selber wieder tötet. 
Darauf muss man sich nicht verlassen, weil es erst nach meinem Destruktor 
passiert, und ich verlass mich auch nicht drauf. 
Denn QSqlCursor ist z.B. nicht von QObject abgeleitet, also gehört der 
spätestens im Destruktor der deklarierenden Klasse deleted.

Noch'n Hinweis an Ludwig:
98 % der SegFaults, die bei mir auftreten, liegen darin begründet, daß ich 
zwar brav meinen Zeiger deklariere (der dann irgendwohin zeigt), ihn aber zu 
initialisieren vergesse, weil der Kontruktor ohne Parameter aufgerufen werden 
kann.
Wenn dann hierauf schreibend oder ausführend zugreife...Peng!

> Wegen dem Constructor: Lokale Variablen die im Constructor deklariert
> werden sind nach dem Constructor wieder weg. Um sie während der
> kompletten Existenz des Objekts zur Verfügung zu haben kommen die dann
> in die Klassendefinition. Im Konstruktor findet dann die Initialisierung
> dergleichen statt.
>
> Falls ich irgendwo quatsch erzähle bitte korrigieren.

Nein, passt alles.
Eine Bitte hätte ich allerdings an dich: http://learn.to/quote!
TOFU ist grauenvoll zu lesen... ;-)

-- 
---
Grüsse aus Meissen
Jörg Pauly

-- 
Um die Liste abzubestellen, schicken Sie eine Mail an:
    [email protected]
Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.