Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anfänger: Array von Objektpointern freigeben (https://www.delphipraxis.net/136216-anfaenger-array-von-objektpointern-freigeben.html)

XoRiC 25. Jun 2009 20:46


Anfänger: Array von Objektpointern freigeben
 
Hallo,

ich bin inzwischen mit Delphi ganz gut vertraut, eine Anfängerfrage hat sich jedoch bis heute hartnäckig gehalten.
Auf Google hab ich es mit dem Suchbegriff "Array von Objektpointern freigeben" (u.ä.) probiert, wurde aber nicht fündig, bzw war unschlüssig, ob der jeweils beschriebene Fall mit meinem übereinstimmt.

Mein Problem:

In einer meiner Units sei eine Objektklasse deklariert, ich nenne sie hier mal TBeispiel.
Von dieser gibt es einige Instanzen, quer über die ganze Unit verteilt.
Ich fasse temporär einige davon in einem Array zusammen.

Delphi-Quellcode:
{...}

type
  TBeispiel = class(TObject)
  private
    // ..
  end;

var
  Beispiel, Beispiel2: TBeispiel;
  MehrBeispiele: array [0..5] of TBeispiel;

procedure {...}
  var temp: array of TBeispiel;
begin
  SetLength(temp, 4);
  temp[0] := Beispiel;
  temp[1] := MehrBeispiele[0];
  temp[2] := MehrBeispiele[3];
  temp[3] := Beispiel2;
end;
Meine Frage:

Wie gebe ich nach Abarbeitung meiner Prozedur das Array temp wieder korrekt frei (die Objekte sollen dabei nicht zerstört werden)?
Ich habe hierzu schon mehrere Lösungen gesehen, einige bezogen sich aber vermutlich nur auf Arrays von einfachen Datentypen.
Welcher der folgenden Vorschläge ist für meinen Anwendungsfall der richtige?

Vorschlag 1:

Delphi-Quellcode:
SetLength(temp, 0);
Vorschlag 2:

Delphi-Quellcode:
temp := nil;
Reicht einer der beiden schon aus, oder ist es notwendig, zunächst alle Pointer := nil zu setzen, wie bei Vorschlag 3:

Delphi-Quellcode:
{...}
var i: integer;
{...}
for i := 0 to High(temp) do temp[i] := nil;
SetLength(temp, 0);
und Vorschlag 4:

Delphi-Quellcode:
{...}
var i: integer;
{...}
for i := 0 to High(temp) do temp[i] := nil;
temp := nil;
Ich glaub ich hab es wieder geschafft, eine einfache Frage auf 2 Din A 4 Seiten auszubreiten :shock:
Da ich aber nicht mit allen Delphi Begriffen vertraut bin, kann ich nur so sicher sein, dass man mich richtig versteht.

Vielen Dank schonmal im Voraus für eure Hilfe!
Lieben Gruß
Xoric

Dax 25. Jun 2009 20:54

Re: Anfänger: Array von Objektpointern freigeben
 
Die Vorschläge sind alle korrekt, aber alle unnötig. Delphi verwaltet den Speicher für dynamische Arrays automatisch, am Ende der Methode ist nichts äquivalent zu "temp := nil" zu "SetLength(temp, 0)" zu ... ;)

Fridolin Walther 25. Jun 2009 20:56

Re: Anfänger: Array von Objektpointern freigeben
 
Wenn Du wirklich die Objekte im Array nicht freigeben/zerstören möchtest, reicht ein SetLength(array, 0). Ansonsten müsstest Du vorher das Array durchgehen und mit FreeAndNil die Objekte freigeben.

@dax:
Ich hab seinen Beispielcode eher als Demonstration gesehen. Es ist zwar richtig, daß beim Verlassen der Prozedur das lokal definierte Array ohnehin abgeräumt wird, aber allgemeingültig ist es nicht zwangsläufig.

Muetze1 25. Jun 2009 20:59

Re: Anfänger: Array von Objektpointern freigeben
 
Zitat:

Zitat von Fridolin Walther
Wenn Du wirklich die Objekte im Array nicht freigeben/zerstören möchtest, reicht ein SetLength(array, 0). Ansonsten müsstest Du vorher das Array durchgehen und mit FreeAndNil die Objekte freigeben.

Wozu den Speicher noch nullen, wenn er danach eh weggeworfen wird? Free reicht da vollkommen...

Fridolin Walther 25. Jun 2009 21:03

Re: Anfänger: Array von Objektpointern freigeben
 
Zitat:

Zitat von Muetze1
Wozu den Speicher noch nullen, wenn er danach eh weggeworfen wird? Free reicht da vollkommen...

Alte Gewohnheit, damit Assigned funktioniert. Aber klar, in diesem speziellen Fall reicht ein Free völlig aus.

XoRiC 25. Jun 2009 21:19

Re: Anfänger: Array von Objektpointern freigeben
 
Hallo an euch drei :)


Die Objekte sollen wirklich nicht zerstört werden.
Das Array temp, wie ich es oben verwendet hab, dient dem Zweck, aus allen Instanzen meiner Klasse TBeispiel nach irgendeinem Kriterium einige herauszufiltern und mit diesen dann irgendetwas zu tun.

Die Zuweisung erfolgt natürlich auch nicht wie im Beispielcode mit festen Indizes, sondern eine eigenständige Prozedur erfasst sämtliche Instanzen, filtert je nach Anfrage einige davon raus und legt so ein temporäres Sammel-Array an.

Zerstört werden soll dabei keine, sondern lediglich das temporäre Array mit den Pointern soll ohne Speicherrückstände wieder verschwinden.


Ich hab schon etwas ungläubig über Dax' Post gegrübelt, tut mir Leid, falls mein Beispielcode mehrere Interpretationen zulässt. Ich werde mich jetzt jedenfalls mal mit

Zitat:

Zitat von Fridolin Walther
Wenn Du wirklich die Objekte im Array nicht freigeben/zerstören möchtest, reicht ein SetLength(array, 0).

begnügen und meine Frage als erledigt markieren.


Vielen Dank für eure schnellen Antworten, Dax, Fridolin und Muetze1 :)
Liebe Grüße
Xoric


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 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