Räumt SetLength(A,0) auch Objekte auf?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Räumt SetLength(A,0) auch Objekte auf?

Beitrag von Uli »

Hallo,
hier mal wieder ein typische Anfänger Frage.
Räumt SetLength(A,0) auch Objekte auf?
Beispiel:

var A: array of TObject;
begin
SetLength(A, 1);
A[0].Create();
...
SetLength(A, 0);
end.

Wird A[0].Free beim "entfernen" des dynamischen Arrays automatisch aufgerufen?
Ich vermute ja, ich muss das selber tun, bevor ich SetLength(A, 0) aufrufe.

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Räumt SetLength(A,0) auch Objekte auf?

Beitrag von theo »

Uli hat geschrieben:Ich vermute ja, ich muss das selber tun, bevor ich SetLength(A, 0) aufrufe.


Du vermutest richtig. Die Objekte könnten ja auch anderswo noch gebraucht werden.
Besser eignet sich TObjectList
http://www.freepascal.org/docs-html/fcl ... tlist.html
Wenn du OwnsObjects auf true setzt, werden diese "gefreed".

Ich verstehe sowieso nicht, wieso sich v.a. Neulinge immer mit Arrays abmühen. Es gibt doch wunderbare Klassen, die das alles fehlerunanfällig erledigen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Räumt SetLength(A,0) auch Objekte auf?

Beitrag von mschnell »

Automatisches free für gespeicherte Instanzen gibt es nur bei bei TObjectList, wenn die entsprechende Option gesetzt ist.

-Michael

Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Re: Räumt SetLength(A,0) auch Objekte auf?

Beitrag von Uli »

Danke für Eure Antworten.
Ich stamme noch aus dem Zeitalter, wo bei 64K Speicher Schluss war und man verkettete Listen noch selber mit Pointern realisieren musste. Vielleicht wird es Zeit, dass ich mal langsam im 21 Jahrhundert ankomme und mehr Klassen nutze.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Räumt SetLength(A,0) auch Objekte auf?

Beitrag von marcov »

theo hat geschrieben:
Uli hat geschrieben:Ich vermute ja, ich muss das selber tun, bevor ich SetLength(A, 0) aufrufe.


Du vermutest richtig. Die Objekte könnten ja auch anderswo noch gebraucht werden.
Besser eignet sich TObjectList
http://www.freepascal.org/docs-html/fcl ... tlist.html
Wenn du OwnsObjects auf true setzt, werden diese "gefreed".

Ich verstehe sowieso nicht, wieso sich v.a. Neulinge immer mit Arrays abmühen. Es gibt doch wunderbare Klassen, die das alles fehlerunanfällig erledigen.


Und sich durch 26 Ebenen von Notifier wursteln, und noch immer nicht skalieren. IMHO sind die Container Klassen einer die Schwachpunkte von Delphi/Lazarus

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Räumt SetLength(A,0) auch Objekte auf?

Beitrag von theo »

@marcov: Du kommst immer mit so pingeligen Performance Argumenten wenn man Neulinge auf den richtigen Pfad bringen will. ;-)
Natürlich hast du im Prinzip recht, aber oft spielt das doch gar keine Rolle. Assembler wäre natürlich noch besser. ;-)

Antworten