Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu möglichem Memory-Leak (https://www.delphipraxis.net/144979-frage-zu-moeglichem-memory-leak.html)

sundance 21. Dez 2009 07:43


Frage zu möglichem Memory-Leak
 
Hallo zusammen,

Ich habe folgende Struktur:
Delphi-Quellcode:
TData = record
  Size: Integer;
  Info: TMemoryStream;
end;

TDataArray = array of TData;
Wenn ich nun zur Laufzeit das dynamische Array so initialisiere:
Delphi-Quellcode:
SetLength(DataArray,1);
DataArray[0].Size := 0;
DataArray[0].Info := TMemoryStream.Create;
reicht es dann zum "Aufräumen" aus, einfach das dyn. Array mit SetLength(DataArray,0) zu entsorgen oder muss vielmehr auch noch vorher für jedes Arrayfeld ein DataArray[n].Info.Free erfolgen?

.sundance.

Bernhard Geyer 21. Dez 2009 07:49

Re: Frage zu möglichem Memory-Leak
 
Zitat:

Zitat von sundance
reicht es dann zum "Aufräumen" aus, einfach das dyn. Array mit SetLength(DataArray,0) zu entsorgen



Zitat:

Zitat von sundance
oder muss vielmehr auch noch vorher für jedes Arrayfeld ein DataArray[n].Info.Free erfolgen?

Ja

sundance 21. Dez 2009 08:08

Re: Frage zu möglichem Memory-Leak
 
Vielen Dank Bernhard,

ich war mir auch fast sicher, dass die Streams vorher versorgt werden müssen.
Ich kann mich nur irgendwie erinnern, dass ich mal was gelesen habe, dass Delphi seine "eigenen" Objekte bei so einer Aktion selbst versorgt... aber wahrscheinlich ging es dabei um sowas wie Strings (für die der Anwender ja auch nicht explizit ein Create braucht).

.sundance.

himitsu 21. Dez 2009 08:34

Re: Frage zu möglichem Memory-Leak
 
TMemoryStream ist ein Objekt und diese werden nie automatisch "entsorgt".
(wenn du dir also auf dem MemoryStream ein Interface machst, dann ginge es)

Es ist praktisch so ... alles was man erstellt sollte man auch wieder freigeben.

Strings (Ansi/Wide/Unicode), DynArrays und Interfaces werden von Delphi automatisch initialisiert und auch wieder automatisch freigegeben (wenn man dieses nicht explizit umgeht ... z.B. via GetMem und FreeMem, in Verbindung mit Records, aber dafür gibt es ja auch New und Dispose).


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