AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Objekte / Freigaben / Free / Nil
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte / Freigaben / Free / Nil

Ein Thema von Alex_ITA01 · begonnen am 9. Okt 2013 · letzter Beitrag vom 10. Okt 2013
Antwort Antwort
Seite 2 von 2     12   
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 15:03
@baumina:
Zitat:
Ich würde im Destroy lieber rückwärts freigeben, also statt for i:=0 to Count-1 lieber for i:=Count-1 downto 0.
Darf ich fragen warum?
Vielleicht kann es nicht schaden, sich das zur Gewohnheit zu machen, denn wenn man z.B. statt FreeAndNil Delete aufruft, bekommt man sonst Probleme. Aber eigentlich ist es hier unnötig...

Edit: Eine andere Sache, die mir an dem Code hier auffällt, ist allerdings die völlige Sinnlosigkeit von FreeAndNil. Die Prozedur gibt dir hier nur falsche Sicherheit, denn alles was sie tut, ist, die lokale Variable auf nil zu setzen. In der Liste selbst ändert sich nichts. Ach das Prüfen mit Assigned ist daher völlig sinnlos und erschwert höchstens die Fehlersuche.

Geändert von Namenloser ( 9. Okt 2013 um 15:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 15:18
@baumina:
Zitat:
Ich würde im Destroy lieber rückwärts freigeben, also statt for i:=0 to Count-1 lieber for i:=Count-1 downto 0.
Darf ich fragen warum?
Hast recht, müsste bei einer StringList egal sein wie rum, da sich ja die Größe der Liste beim Object.Free nicht verändert.

EDIT : Aber solltest du im Destroy nicht einen TypeCast auf TMyOwnObject machen? FreeAndNil(TMyOwnObject(Objects[i]))
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina ( 9. Okt 2013 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.134 Beiträge
 
Delphi 12 Athens
 
#3

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 15:22
Ok, danke für die Hinweise.
Mich interessiert natürlich jetzt noch das Thema mit dem FreeAndNil(tmpObj) und dem Object was noch später verfügbar ist.

Bzw. Wie gibt man die Objecte innerhalb der Liste denn richtig frei?

Gruß
Let's fetz sprach der Frosch und sprang in den Mixer

Geändert von Alex_ITA01 ( 9. Okt 2013 um 15:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.631 Beiträge
 
Delphi 12 Athens
 
#4

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 15:27
Du kannst dir bei XE4 die Ableitung von TStringList sparen, wenn du deren property OwnsObjects auf true setzt. Damit gibt die Liste beim Löschen von Elementen und somit auch im eigenen Destroy auch die Objects frei.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#5

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 15:26
Um den Knoten aufzulösen: Löschen mehrerer Elemente in einer Liste sollte man bei einer For-Schleife rückwärts machen, um Indexfehler zu vermeiden, da die Schleifenanzahl dort nur einmalig ermittelt wird. Alternativ kann man auch eine While-Schleife benutzen:
Delphi-Quellcode:
while Liste.Count > 0 do
  Liste.Delete(0);
Beim Ändern von Elementen ist es im Normalfall egal, ob man das vorwärts oder rückwärts macht, es sei denn, die Liste löscht in bestimmten Fällen selbstständig Einträge. Sofern man sich nicht sicher ist: rückwärts durchlaufen, dann kann man nicht viel falsch machen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 15:30
Alternativ kann man auch eine While-Schleife benutzen:
Delphi-Quellcode:
while Liste.Count > 0 do
  Liste.Delete(0);
Hat dann allerdings quadratische Laufzeit.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#7

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 16:34
EDIT : Aber solltest du im Destroy nicht einen TypeCast auf TMyOwnObject machen? FreeAndNil(TMyOwnObject(Objects[i]))
Das ist für den Aufruf des richtigen Destruktors nicht notwendig. Destroy ist schon in der Basisklasse TObject virtuell deklariert.
Jede Klasse muss Destroy, wenn erforderlich, in geeigneter Weise überschrieben, um die Instanz vollständig freizugeben.
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.134 Beiträge
 
Delphi 12 Athens
 
#8

AW: Objekte / Freigaben / Free / Nil

  Alt 9. Okt 2013, 20:10
@Uwe: Ich habe ja nur den Quelltext an den beiden besagten Stellen angepasst. Siehe also mein Beispiel im ersten Post, dort steht ja im FormDestroy "MyObjList.Free;".
Trotzdem kann ich nach der besagten Änderung (OwnObjects=True) immernoch im FormDestroy nach dem "MyObjList.Free;" folgendes abfragen/aufrufen:

Delphi-Quellcode:
if Assigned(tmpObject) then
  begin
    if tmpObject.CheckA then
      Sleep(0);
    if Assigned(tmpObject.ObjInternList) then
      Sleep(0);
  end;
Das ist ja nur eine Minianwendung wo es recht übersichtlich ist. Wie kann man denn ganz sicher die Objekte freigeben und falls jemand anderes (vielleicht ein parallel laufender Thread) diese auf Gültigkeit abfragt auch wirklich feststellen, dass man noch drauf zu greifen kann?!

Gruß
Let's fetz sprach der Frosch und sprang in den Mixer
  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 07:50 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