Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sauber Programmieren: Variablen zurücksetzen? (https://www.delphipraxis.net/49462-sauber-programmieren-variablen-zuruecksetzen.html)

Robert Marquardt 12. Jul 2005 07:15

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:
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;
Bei globalen Variablen legt Delphi zusaetzliche initialization und finalization Sections an, um das zu erledigen.
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.

Hansa 12. Jul 2005 08:08

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.

sniper_w 12. Jul 2005 09:49

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:

Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P<> nil for a pointer variable, and @P <> nil for a procedural variable.

Assigned returns False if P is nil, True otherwise.

Note: Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.

jbg 12. Jul 2005 10:15

Re: Sauber Programmieren: Variablen zurücksetzen?
 
Zitat:

Zitat von sniper_w
Auf jedem Fall sollte man im Kopf haben, dass nach Obj.Free; immer Obj := nil; kommt oder einfacher FreeAndNil(Obj);.

Bei lokalen Variablen ist das völlig unnütz und verlangsamt, wenn auch nur sehr gering, die Ausführgeschwindigkeit. Warum sollte man eine Variable, die von anderen Daten auf dem Stack nach dem Verlassen der Funktion überschieben wird, noch auf nil setzen? Auf diese lokale Variable kann ja sowieso nicht mehr zugegriffen werden, da der Compiler einen Syntaxfehler ausgibt, wenn man in Funktion A auf die lokalen Variablen der Funktion B zugreifen will.
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.

sniper_w 12. Jul 2005 12:16

Re: Sauber Programmieren: Variablen zurücksetzen?
 
Zitat:

Ich persönlilch nutze FreeAndNil nur dann, wenn nicht vorhersagbar ist, dass irgendetwas noch darauf zugreifen könnte.
So war´s auch gemeint.

Rakshasa 12. Jul 2005 13:24

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().

:)

Khabarakh 12. Jul 2005 13:31

Re: Sauber Programmieren: Variablen zurücksetzen?
 
Zitat:

Zitat von Rakshasa
eigene Typen

Eigene Klassen :wink:, eben alle zur Laufzeit instanziierten, die kein Parent haben, kein Item einer TObjectList (AOwnsObject = true) sind oder sonstwie verwaltet werden.
Zitat:

oder Arrays
Laut Robert Marquardt erledigt das Delphi.

BrunoT 17. Nov 2005 12:23

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 08:28 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz