AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TStringList mit Objekten: Free oder FreeAndNil?
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList mit Objekten: Free oder FreeAndNil?

Ein Thema von PeterPanino · begonnen am 31. Okt 2009 · letzter Beitrag vom 1. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#1

TStringList mit Objekten: Free oder FreeAndNil?

  Alt 31. Okt 2009, 12:41
In einer TStringList mit OwnsObjects: Werden mit FreeAndNil auch die Objekte der Listenelemente freigegeben, oder reicht dazu Free aus?

Delphi-Quellcode:
MyStringList := TStringList.Create;
MyStringList.OwnsObjects := True;
try
  while DerTagLangIst do
    MyStringList.AddObject(AString, TMyObj.Create);
finally
  //MyStringList.Free;
  FreeAndNil(MyStringList); // besser?
end;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 31. Okt 2009, 12:43
FreeAndNil() setzt zusätzlich zum aufruf von .Free() noch die Referenzvariable für die Stringliste auf Nil.
Markus Kinzler
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 31. Okt 2009, 12:59
Zitat von mkinzler:
FreeAndNil() setzt zusätzlich zum aufruf von .Free() noch die Referenzvariable für die Stringliste auf Nil.
Danke, genau das steht auch in der Onlinehilfe. Werden die Objekte der Listenelemente (MyObj) bei MyStringList.Free bzw. FreeAndNil(MyStringList) auch freigegeben oder muss man die vorher "manuell" freigeben?

Etwa so?:

Delphi-Quellcode:
MyStringList := TStringList.Create;
MyStringList.OwnsObjects := True;
try
  while DerTagLangIst do
    MyStringList.AddObject(AString, TMyObj.Create);
finally
  for i := 0 to MyStringList.Count - 1 do
    FreeAndNil(MyStringList.Objects[i]);

  //MyStringList.Free;
  FreeAndNil(MyStringList); // besser?
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 31. Okt 2009, 12:59
Mein Delphi 2007 kennt zwar noch kein OwnsObjects bei Stringlisten, aber ich mutmaße einmal, dass es sich so verhält wie bei einer TObjectlist, d.h. beim Freigeben der Liste werden auch die enthaltenen Objekte "entsorgt".

[edit] Um sicherzugehen kannst Du Dir doch einmal eine Testanwendung schreiben und ReportMemoryLeaksOnShutdown auf true setzen. Wenn ohne manuelle Freigabe keine Speicherlecks gemeldet werden, habe ich wohl recht. [/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
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#5

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 1. Nov 2009, 11:43
Zitat von PeterPanino:
Werden die Objekte der Listenelemente (MyObj) bei MyStringList.Free bzw. FreeAndNil(MyStringList) auch freigegeben oder muss man die vorher "manuell" freigeben?
  FreeAndNil(MyStringList); entspricht

Delphi-Quellcode:
  MyStringList.Free;
  MyStringList := nil; //Das ist der einzige Unterschied
Damit sollte es klar sein, dass es für die Objekte in der StringList keinen Unterschied macht.

Wie DeddyH schon vorgeschlagen hat: Probiere es aus, wobei ich vermute, dass die Objecte manuell freigegeben werden müssen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 1. Nov 2009, 12:56
Zitat von guidok:
wobei ich vermute, dass die Objecte manuell freigegeben werden müssen.
Welchen Sinn sollte die Property aber dann haben?
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
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 1. Nov 2009, 14:13
Meiner Erinnerung zufolge gibt die TStringList die Objekte nicht frei. Der Sinn hinter dem Objects-Konstrukt ist schlicht, dass man ein Dictionary aufbauen kann. Bei der TListBox z.B. finde ich es sehr nützlich, zu jedem Eintrag noch Nutzdaten hinterlegen zu können.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 1. Nov 2009, 15:10
Es geht aber um OwnsObjects.
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
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 1. Nov 2009, 15:17
Oha. Immer diese neuen Delphi-Versionen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker
Online

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: TStringList mit Objekten: Free oder FreeAndNil?

  Alt 1. Nov 2009, 16:31
Hallo PeterPanino,

Delphi-Quellcode:
for i := 0 to MyStringList.Count - 1 do
    FreeAndNil(MyStringList.Objects[i]);
(das wird so nicht funktionieren, weil sich Count bei jedem Schleifendurchlauf ändert.)
Sorry, das ist Blödsinn siehe Apollonius.

Delphi-Quellcode:
for i := MyStringList.Count-1 downto 0 do
begin
  FreeAndNil(MyStringList.Objects[i]);
end;
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  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 07:37 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