![]() |
Listen freigeben
Hallo Leute,
ich arbeite gewöhnlich nicht mit Delphi; habe eine einfache Frage: Wie werden Array und Listen korekt freigegeben in Delphi? Reicht es wenn man nur die Liste selbst freigibt oder muss man auch alle Elemente der Liste separat freigeben? |
Re: Listen freigeben
Meine Hilfe sagt zu TList.Clear
Zitat:
Delphi-Quellcode:
die Größe auf 0 setzt.
SetLength(DeinArray,0);
|
Re: Listen freigeben
Bei TList musst du dich selbst um das Freigeben der Elemente der Liste kümmern, die sich hinter den einzelnen Items verbergen. Eine Liste, die auch deren Speicher direkt mit freigibt, ist zum Beispiel TObjectList.
Bis denn Bommel |
Re: Listen freigeben
Also stimmt mal wieder nicht, was in der Hilfe steht :?
[edit] :wiejetzt: Wo ist mein Text geblieben? [/edit] |
Re: Listen freigeben
Zitat:
Zitat:
Bis denn Bommel |
Re: Listen freigeben
Noch mal zum Verständnis: angenommen, ich habe folgenden Typen definiert
Delphi-Quellcode:
Und nun befülle ich eine TList mit lauter PMyRecs. Was geschieht denn nun mit den Records beim Aufruf von Clear?
type PMyRec = ^TMyRec;
TMyRec = record Feld1, Feld2: integer; end; [edit] Hab gerade mal in den Sourcen von Delphi 5 nachgesehen. Es werden dort lediglich Count und Capacity auf 0 gesetzt.
Delphi-Quellcode:
Wenn ich das nun richtig verstehe, wird nur der Speicher, den die jeweiligen Zeiger verbrauchen, freigegeben. [/edit]
procedure TList.SetCapacity(NewCapacity: Integer);
begin if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then Error(@SListCapacityError, NewCapacity); if NewCapacity <> FCapacity then begin ReallocMem(FList, NewCapacity * SizeOf(Pointer)); FCapacity := NewCapacity; end; end; procedure TList.SetCount(NewCount: Integer); var I: Integer; begin if (NewCount < 0) or (NewCount > MaxListSize) then Error(@SListCountError, NewCount); if NewCount > FCapacity then SetCapacity(NewCount); if NewCount > FCount then FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0) else for I := FCount - 1 downto NewCount do Delete(I); FCount := NewCount; end; |
Re: Listen freigeben
Ich selbst arbeite eigentlich fast immer mit Objekten, weniger mit records, daher die Antwort unter leichtem Vorbehalt, aber eigentlich: Mit denen passiert nix - will heißen: Sie bleiben ziemlich heimatlos im Speicher stehen. Wenn du die records beim Freigeben der Liste nicht selbst wieder entfernt, wirst du später auch ein Problem haben, da du dir mit der Liste ja auch sämtliche Pointer auf die Records gelöscht hast. Heißt: du kannst sie während des Programmlaufs gar nicht mehr freigeben.
Bis denn Bommel |
Re: Listen freigeben
Überschnitten, hatte gerade editiert :lol:
|
Re: Listen freigeben
Jau. :) Aber da ich deine Aussage ja eigentlich eh nur unterstützt habe, ist's ja nicht schlimm...
Für dein Beispiel müsstest du im Prinzip eine TRecordList erstellen und in deren Clear-Methode für alle Elemente der Liste ein Dispose aufrufen. Dann sollte es sauber sein. Bis denn Bommel |
Re: Listen freigeben
Nochmal zum mitschreiben: Also wenn ich mir das so erstelle:
Delphi-Quellcode:
und ich das so freigebe:
MyObjectList := TObjectList.Create();
Delphi-Quellcode:
ist der komplette Speicher inklusive des Speichers der von den einzelnen Elementen/Objekten belegt wurde freigegeben?
MyObjectList.Clear;
FreeAndNil(MyObjectList); Wenn ja: Was ist wenn meine Elemente/Objekte in der ObjectList wiederum eine ObjectList enthält:
Delphi-Quellcode:
Wird mit der oben genannten Methode auch der Speicher der ObjectList (bzw. der der Objekte der ObjectList) im Objekt der freizugebenden ObjectList freigegeben? :roteyes:
TMyObject = class
MyNumber : Byte; MyType : Byte; FriendsList : TObjectList; // for TFriendListItem end; TFriendListItem = class FriendNumber : byte; constructor create (FriendNumber : Byte); end; Ihr wisst was ich meine, oder :?: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 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