Delphi-PRAXiS
Seite 1 von 2  1 2      

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()?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.
Seite 1 von 2  1 2      

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