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