AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Sauber Programmieren: Variablen zurücksetzen?
Thema durchsuchen
Ansicht
Themen-Optionen

Sauber Programmieren: Variablen zurücksetzen?

Ein Thema von Rakshasa · begonnen am 11. Jul 2005 · letzter Beitrag vom 17. Nov 2005
Antwort Antwort
Seite 2 von 2     12   
Robert Marquardt
(Gast)

n/a Beiträge
 
#11

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 12. Jul 2005, 07:15
"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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#12

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 12. Jul 2005, 08:08
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#13

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 12. Jul 2005, 09:49
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.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#14

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 12. Jul 2005, 10:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#15

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 12. Jul 2005, 12:16
Zitat:
Ich persönlilch nutze FreeAndNil nur dann, wenn nicht vorhersagbar ist, dass irgendetwas noch darauf zugreifen könnte.
So war´s auch gemeint.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von Rakshasa
Rakshasa

Registriert seit: 1. Nov 2003
182 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 12. Jul 2005, 13:24
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().

  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#17

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 12. Jul 2005, 13:31
Zitat von Rakshasa:
eigene Typen
Eigene Klassen , 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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von BrunoT
BrunoT

Registriert seit: 23. Jan 2003
Ort: Sandbeiendorf
360 Beiträge
 
Delphi 8 Professional
 
#18

Re: Sauber Programmieren: Variablen zurücksetzen?

  Alt 17. Nov 2005, 12:23
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?

mfg

BrunoT
Holger

EDV- Ende der Vernunft
Meine Calcedit-Kompo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr.
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