AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listen freigeben

Ein Thema von conti · begonnen am 16. Apr 2008 · letzter Beitrag vom 13. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
conti

Registriert seit: 10. Nov 2006
19 Beiträge
 
#1

Listen freigeben

  Alt 16. Apr 2008, 10:15
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Listen freigeben

  Alt 16. Apr 2008, 10:19
Meine Hilfe sagt zu TList.Clear
Zitat:
Mit Clear wird das Array Items geleert, und Count sowie Capacity werden auf 0 gesetzt. Außerdem wird der gesamte vom Array belegte Speicher freigegeben.
Und dynamische Arrays gibst Du frei, indem Du mittelsSetLength(DeinArray,0); die Größe auf 0 setzt.
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
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#3

Re: Listen freigeben

  Alt 16. Apr 2008, 10:23
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Listen freigeben

  Alt 16. Apr 2008, 10:25
Also stimmt mal wieder nicht, was in der Hilfe steht

[edit] Wo ist mein Text geblieben? [/edit]
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
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#5

Re: Listen freigeben

  Alt 16. Apr 2008, 10:31
Zitat von DeddyH:
Also stimmt mal wieder nicht, was in der Hilfe steht
Doch, eigentlich schon. Der Speicher der Items (was ja letztlich ein Array von Zeigern ist) wird bei TList ja auch freigegeben. Nur: Diese Items zeigen ja bei den meisten Listen auf irgendwelche anderen Objekte und DEREN Speicher wird eben nicht freigegeben. Im Gegensatz dazu gibt TObjectList den Speicher sowohl der Zeiger aus der Liste wie auch den Speicher der Objekte, die sich dahinter verbergen, frei.

Zitat von DeddyH:
[edit] Wo ist mein Text geblieben? [/edit]
Ich hab nix geklaut.

Bis denn
Bommel
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Listen freigeben

  Alt 16. Apr 2008, 10:46
Noch mal zum Verständnis: angenommen, ich habe folgenden Typen definiert
Delphi-Quellcode:
type PMyRec = ^TMyRec;
TMyRec = record
  Feld1,
  Feld2: integer;
end;
Und nun befülle ich eine TList mit lauter PMyRecs. Was geschieht denn nun mit den Records beim Aufruf von Clear?

[edit] Hab gerade mal in den Sourcen von Delphi 5 nachgesehen. Es werden dort lediglich Count und Capacity auf 0 gesetzt.
Delphi-Quellcode:
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;
Wenn ich das nun richtig verstehe, wird nur der Speicher, den die jeweiligen Zeiger verbrauchen, freigegeben. [/edit]
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
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#7

Re: Listen freigeben

  Alt 16. Apr 2008, 10:51
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Listen freigeben

  Alt 16. Apr 2008, 10:54
Überschnitten, hatte gerade editiert
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
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#9

Re: Listen freigeben

  Alt 16. Apr 2008, 10:58
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
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#10

Re: Listen freigeben

  Alt 13. Nov 2008, 08:56
Nochmal zum mitschreiben: Also wenn ich mir das so erstelle:

  MyObjectList := TObjectList.Create(); und ich das so freigebe:

Delphi-Quellcode:
  MyObjectList.Clear;
  FreeAndNil(MyObjectList);
ist der komplette Speicher inklusive des Speichers der von den einzelnen Elementen/Objekten belegt wurde freigegeben?


Wenn ja:
Was ist wenn meine Elemente/Objekte in der ObjectList wiederum eine ObjectList enthält:
Delphi-Quellcode:
  TMyObject = class
                        MyNumber : Byte;
                        MyType : Byte;
                        FriendsList : TObjectList; // for TFriendListItem
                      end;

  TFriendListItem = class
                        FriendNumber : byte;
                        constructor create (FriendNumber : Byte);
                      end;
Wird mit der oben genannten Methode auch der Speicher der ObjectList (bzw. der der Objekte der ObjectList) im Objekt der freizugebenden ObjectList freigegeben?
Ihr wisst was ich meine, oder
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:57 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