Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Objekte / Freigaben / Free / Nil (https://www.delphipraxis.net/176997-objekte-freigaben-free-nil.html)

Der schöne Günther 9. Okt 2013 15:17

AW: Objekte / Freigaben / Free / Nil
 
In dem Fall vielleicht nicht. Aber angenommen, man iteriert rein über den Index über eine Liste und
Delphi-Quellcode:
meineListe.EntferneEintragMitNummer(34)
lässt nun alles nach Stelle 34 aufrücken? Dann doch wohl.

baumina 9. Okt 2013 15:18

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1231423)
@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]))

Alex_ITA01 9. Okt 2013 15:22

AW: Objekte / Freigaben / Free / Nil
 
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ß

DeddyH 9. Okt 2013 15:26

AW: Objekte / Freigaben / Free / Nil
 
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.

Uwe Raabe 9. Okt 2013 15:27

AW: Objekte / Freigaben / Free / Nil
 
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.

Namenloser 9. Okt 2013 15:30

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von DeddyH (Beitrag 1231440)
Alternativ kann man auch eine While-Schleife benutzen:
Delphi-Quellcode:
while Liste.Count > 0 do
  Liste.Delete(0);

Hat dann allerdings quadratische Laufzeit.

Alex_ITA01 9. Okt 2013 15:35

AW: Objekte / Freigaben / Free / Nil
 
Ich muss allerdings TStringList ableiten, da ich noch ein paar andere Funktionen nachgepflegt habe in meiner abgeleitetn TStringList.
Reicht es dann, wenn ich in meiner abgeleiteten Liste das OwnObjects auf True setze?

Gruß

Uwe Raabe 9. Okt 2013 15:38

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1231445)
Ich muss allerdings TStringList ableiten, da ich noch ein paar andere Funktionen nachgepflegt habe in meiner abgeleitetn TStringList.
Reicht es dann, wenn ich in meiner abgeleiteten Liste das OwnObjects auf True setze?

Ja.

Alex_ITA01 9. Okt 2013 15:47

AW: Objekte / Freigaben / Free / Nil
 
Ich habe jetzt folgendes geändert aber das globale Objekt ist immernoch verfügbar:

Delphi-Quellcode:
destructor TFreeObjList.Destroy;
Var
  i     : Integer;
  TmpObj : TObject;
begin
  {for i:=0 to Count-1 do
  begin
    TmpObj := Objects[i];
    if Assigned(TmpObj) then
      FreeAndNil(TmpObj);
  end; }

  Inherited Destroy;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
  MyObjList := TFreeObjList.Create;
  MyObjList.OwnsObjects := True;
end;
Also hat sich eigentlich nichts dadurch geändert.
Was habe ich denn falsch gemacht bzw. falsch verstanden?

Gruß

Uwe Raabe 9. Okt 2013 15:59

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1231447)
Ich habe jetzt folgendes geändert aber das globale Objekt ist immernoch verfügbar:

Delphi-Quellcode:
procedure TForm4.FormCreate(Sender: TObject);
begin
  MyObjList := TFreeObjList.Create;
  MyObjList.OwnsObjects := True;
end;

Und wo gibst du MyObjList frei? Ich hätte jetzt im FormDestroy ein MyObjList.Free oder ein entsprechendes FreeAndNil erwartet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.
Seite 2 von 5     12 34     Letzte »    

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