Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dyn. Array freigeben (https://www.delphipraxis.net/134038-dyn-array-freigeben.html)

Christian18 14. Mai 2009 13:02


Dyn. Array freigeben
 
Hallo,

ich nutze ein dynamisches Array als Klassenvariable.
Delphi-Quellcode:
type
  TTest = class
  private
    testarray: Array of Int64;
  public
    constructor Create(pSize: Cardinal);
    destructor Destroy();
  end;
Im Konstruktor setze ich die Größe.
Delphi-Quellcode:
constructor TTest.Create(pSize: Cardinal);
begin
  SetLength(testarray, pSize);
end;
Außerdem habe ich auch noch eine Destruktor.
Delphi-Quellcode:
destructor TTest.Destroy();
begin
  // sollte ich hier das array löschen? oder zerstören? wenn ja, wie?
end;
MfG Christian18

Apollonius 14. Mai 2009 13:04

Re: Dyn. Array freigeben
 
Das ist das tolle an solchen Sprachfeatures: Du musst auf nichts achten. Also: Die Freigabe erfolgt automatisch (im vom Destruktor "magisch" aufgerufenen TObject.CleanupInstance, um genau zu sein).

Christian18 14. Mai 2009 13:21

Re: Dyn. Array freigeben
 
Ok, dann versteh ich aber eins nicht, warum macht Delphi das dann nicht auch mit Objekten?

Also wenn ich ein Array von Objekten habe, dann sollte ich diese im Destructor wieder freigeben. Warum nun mit Variablentyen nicht?

MfG Christian18

Apollonius 14. Mai 2009 13:25

Re: Dyn. Array freigeben
 
Bei Objekten weiß Delphi nicht, wem sie gehören. Wenn ein Control freigegeben wird, soll das Elterncontrol erhalten bleiben.

himitsu 14. Mai 2009 21:20

Re: Dyn. Array freigeben
 
Zitat:

Zitat von Christian18
wenn ja, wie?

es wurde ja schon erklärt daß es nicht nötig wäre,
aber falls dennoch mal jemand ein (dynamisches) Array freigeben möchte ...

einfach die Länge auf 0 (null) setzen :zwinker:
Delphi-Quellcode:
SetLength(testarray, 0);
in Delphi geh bei (dynamischen) Arrays aber auch sowas:
Delphi-Quellcode:
testarray := nil;

quendolineDD 14. Mai 2009 22:55

Re: Dyn. Array freigeben
 
Aber auch nur, da der Array selber ein Zeiger ist.

himitsu 14. Mai 2009 23:17

Re: Dyn. Array freigeben
 
Zitat:

Zitat von quendolineDD
Aber auch nur, da der Array selber ein Zeiger ist.

nicht direkt ... nur weil Delphi bzw. die Compilermagic, bei einer Zuweisung von NIL an ein dynamisches Array (OK, welches intern eine Art Zeiger ist) die Funktion System.DynArrayClear aufruft, welches übrigens auch System.DynArraySetLength bei einer Länge von <= 0 aufruft.
DynArraySetLength ist der interne Name der Funtion, welche eigentlich aufgerufen wird, wenn man SetLength auf ein dyn. Array anwendet.

also hier würde der Speicher, auf welche P zeigen würde, nicht "einfach so" freigegeben :!:
Delphi-Quellcode:
Var P: Pointer;

...
P := nil;

Sven M. 15. Mai 2009 07:26

Re: Dyn. Array freigeben
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Christian18
wenn ja, wie?

es wurde ja schon erklärt daß es nicht nötig wäre,
aber falls dennoch mal jemand ein (dynamisches) Array freigeben möchte ...

einfach die Länge auf 0 (null) setzen :zwinker:
Delphi-Quellcode:
SetLength(testarray, 0);
in Delphi geh bei (dynamischen) Arrays aber auch sowas:
Delphi-Quellcode:
testarray := nil;


...was allerdings auch nur geht, wenn keine Objekte im Array enthalten sind. Diese müssten nämlich gesondert freigegeben werden, sonst gibts Memoryleaks...;)

himitsu 15. Mai 2009 08:31

Re: Dyn. Array freigeben
 
jupp, aber diese muß man so oder so immer selber freigeben
und das hat nix mit der Freigabe des Arrays
(nicht dem Inhalt ... wobei dort wie auch hier z.B. bei Strings und anderen untergeordnete dyn. Arrays wiederrum die Compilermagic eingreift :nerd: ) zu tun

Medium 15. Mai 2009 10:27

Re: Dyn. Array freigeben
 
Delphi-Referenz durchsuchenFinalize()?

hitzi 15. Mai 2009 10:44

Re: Dyn. Array freigeben
 
Trifft das auch auf ein "array of record" zu?

So in der Art:
Delphi-Quellcode:
type Test = record
       test1 : string;
       test2 : integer;
     end;
     TestArray = array of Test;

var dummy : TestArray;

sirius 15. Mai 2009 10:52

Re: Dyn. Array freigeben
 
Zitat:

Zitat von hitzi
Trifft das auch auf ein "array of record" zu?

Ja, außer da sind Objekte enthalten.

hitzi 15. Mai 2009 10:58

Re: Dyn. Array freigeben
 
Oh Mann und ich geb immer fleißig dieses Arrays selber frei. Selbst die Strings in Arrays setz ich zurück. Da kann ich mir in Zukunft ein wenig Arbeit sparen :)

himitsu 15. Mai 2009 11:37

Re: Dyn. Array freigeben
 
Zitat:

Zitat von sirius
Zitat:

Zitat von hitzi
Trifft das auch auf ein "array of record" zu?

Ja, außer da sind Objekte enthalten.

praktisch alles was man selber (oder was z.B. in irgendeiner Funktion/Prozedur) z.B. per GetMem, .Create und Co. reserviert hat, muß man selber freigeben ... der Rest (wo der Speicher von Delphi verwaltet und resserviert und initialisiert wurde, wozu auch alles per SetLength resservierte zählt) wird auch automatisch wieder freigegeben.

Also Objekte und Interfaces und dyn. Arrays (wobei String auch einem dynamischen Array entspricht) muß also nicht unbedingt selbst freigegeben werden, aber es ist auch nicht sooo schlimm, wenn man es dennoch macht. :angel:


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