![]() |
Sauber Programmieren: Variablen zurücksetzen?
Hallo!!
Ist es eigentlich notwendig, die verwendeten Variablen eines begin...end am Schluss manuell zurückzusetzen, also z.B. so:
Delphi-Quellcode:
Oder macht Delphi das ausreichend von alleine?
Procedure MeineProcedure;
var s: String; i: integer; myarray: Array of TString; begin // code code code code s := ''; i := -1; SetLength(MyArray, 0); end; [edit=alcaeus]code- durch delphi-Tags ersetzt. Bitte in Zukunft die richtigen Tags verwenden, Danke. Mfg, alcaeus[/edit] |
Re: Sauber Programmieren: Variablen zurücksetzen?
variablen innerhalb einer prozedur werden auf den stack abgelegt wenns nicht gerade ein string ist
aber da macht delphi das auch noch selber einzigst bei komponenten die du erzeugst, die solltest du mit .free wieder freigeben |
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
Delphi-Quellcode:
FreeAndNil(MyObj);
|
Re: Sauber Programmieren: Variablen zurücksetzen?
sollte man ein dynamisches array nicht auch besser wieder auf die länge null setzen (und eventuell noch finalize'n)?
|
Re: Sauber Programmieren: Variablen zurücksetzen?
Das da geht in Richtung lokale/globale Variablen ! Woher soll denn das arme Programm wissen, was noch passiert ? Die Variablen müssen also nicht "zurückgesetzt" werden, sondern nur richtig initialisiet werden beim Programmstart.
|
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
aber "einfache" lokale variablen (wie z.b. Integer, Chars, statische Arrays etc) muss man nicht wieder auf einen standardwert setzen, da die variablen eh im stack liegen, der nach verlassen der procedure eh nichtmehr erreichbar ist. |
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
|
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
|
Re: Sauber Programmieren: Variablen zurücksetzen?
naja ein "array of TString" gehört da ja nicht unbedingt dazu, und das muss man sogar in zweifacher hinsicht freigeben - erst die TStrings einzeln, und dann noch das array auf Länge null setzen.
|
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
|
Re: Sauber Programmieren: Variablen zurücksetzen?
"array of" und string werden ausschliesslich auf dem Heap alloziiert.
Delphi implementiert daher ein heimliches try finally, um die lokalen Variablen zu initialisieren und finalisieren.
Delphi-Quellcode:
Bei globalen Variablen legt Delphi zusaetzliche initialization und finalization Sections an, um das zu erledigen.
var
Bla: array of Integer; begin try Bla := nil; // das sind Null Elemente .... // Userteil der Funktion finally SetLength(Bla, 0); // das dealloziiert die Variable und setzt auf Null Elemente = nil end; end; Man sollte daher globale, getypte und initialisierte Konstanten-Arrays mit Strings vermeiden. Meist genuegt es PChar zu verwenden. Delphi spart sich dann die Sections und wandelt die PChars erst in Strings um wenn man sie benutzt. |
Re: Sauber Programmieren: Variablen zurücksetzen?
Irgendwelche Variablen sollten vor der ersten/erneuten Benutzung initialisiert werden ! Wenn es lokale Variablen sind, dann nützt es nichts, diese "zurückzusetzen", denn bei einem erneuten Aufruf einer Prozedur sind sie eventuell doch wieder undefiniert !
Ansonsten wäre eben nur der Ausweg, sich mit den Speicher-Eingeweiden von Delphi rumzuschlagen. Das würde ich mir aber ersparen und grundsätzlich den Weg einer sauberen Initialisierung wählen. |
Re: Sauber Programmieren: Variablen zurücksetzen?
Auf jedem Fall sollte man im Kopf haben, dass nach Obj.Free; immer Obj := nil; kommt oder einfacher FreeAndNil(Obj);. Denn sollte man später mit Assigned überprüfen ob ein Objekt noch "da" ist, so könnte man falsche ergebnisse bekommen und somit eine AV ;).
Zitat:
|
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
Und wer meint, der müsse mittels ESP auf diese bereits als ungültig deklarierten Daten zugreifen, der wird sich sicherlich mehr Gedanken machen, wie er mit lokalen Variablen umzugehen hat. Ich persönlilch nutze FreeAndNil nur dann, wenn nicht vorhersagbar ist, dass irgendetwas noch darauf zugreifen könnte. So ist es bei Controls im Desktruktor oft nötig FreeAndNil zu benutzen und in den Methoden Resize, Paint, ... eine Abfrage einzubauen. Aber bei plain Objekten mache ich das nur in ganz seltenen Fällen. |
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
|
Re: Sauber Programmieren: Variablen zurücksetzen?
Hm, danke für die aufschlussreichen Antworten bisher!!!! :)
Ich fasse mal zusammen: "Einfache" Variablen (z.B. String, Char, Integer) müssen nicht zurückgesetzt werden, eigene Typen oder Arrays aber schon, also z.B. .free oder SetLenght(xxx,0) oder FreeAndNil(). :) |
Re: Sauber Programmieren: Variablen zurücksetzen?
Zitat:
Zitat:
|
Re: Sauber Programmieren: Variablen zurücksetzen?
Hi
noch 'ne Frage dazu: ich erzeuge ein Array of TButton mit Form als Parent. Beim Verlassen des Programms muss ich die Buttons nicht frei geben oder? :gruebel: mfg BrunoT |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz