Hallo, Am Tue, 22 Nov 2005, adsci schrieb:
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?
Ja. Mit 'static' deklarierte Variablen. Bsp.: ,----[ staticvar.cc ] | #include <cstdio> | | int foo(void) { | static int j = 0; | return ++j; | } | | int bar(void) { | int k = 0; | return ++k; | } | | int main(void) { | for( register int i = 0; i < 10; ++i ) { | printf("foo=%i, bar=%i\n", foo(), bar()); | } | return 0; | } `---- Note: Zumindest fuer sowas ziehe ich printf aus <cstdio> dem cout aus <iostream> deutlich vor... Aufgabe: fuehre obiges Beispiel jew. eine '{}'-Ebene "tiefer" und demonstriere dabei den Effekt der zusaetzlichen '{}'.
Falls ich irgendwo quatsch erzähle bitte korrigieren.
s.o.
Ludwig Fromke wrote:
Ich muß vorausschicken das ich gerade meine ersten Gehversuche mit Qt und C++ unter Suse Linux 9.3 mache. [..] 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)
Ja. Was du mit 'new' anlegst musst du mit 'delete' abraeumen. Deshalb sollten Variablen wenn moeglich "automatisch" und so lokal wie moeglich sein (wie das 'k' in bar() oben). Auch bei "Member"-Variablen von Objekten gilt das uebrigens. Gut ist es, wenn man die Variablen / Member im Konstruktur nur _initialisieren_, nicht aber Speicher (per new) allokieren muss. Anders ausgedrueckt: mit 'new'/'delete' sollte man so umgehen wie mit '?alloc'/'free' in C.
Aber selbst in den Beispielen von Qt finde ich immer nur sowas: QSqlCursor cur( "prices" );
Auch du solltest dich in die _GRUNDLAGEN_ von C++ einlesen! Insbesondere auch bzgl. new/delete vs. "automatische" Stack-Variablen. -dnh --
"Gah. You know there's people apparently people paying for pr0n feeds for their cellphone." -- Peter da Silva "Yeah, I know. I helped build the infrastructure." -- Matt McLeod [sig courtesy of AdB]