Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Array objekte destroy? (https://www.delphipraxis.net/132905-array-objekte-destroy.html)

knoby 21. Apr 2009 22:19


Array objekte destroy?
 
Hallo


ich habe da ein Problem ich arbeite schon etwas länger mit Delphi. Auch mit eigenen Klassen, die ich ja mit create erschaffe und dann mit destroy wieder freigebe und ich habe mir angewöhnt Objekte die nicht mehr gebraucht werden sofort freizugeben.

So jetzt zu meinem Problem ich habe eine Klasse erstellt und dann ein Array mit dynamischer länge die während der laufzeit öfter geändert wird.


So wenn ich hinten was dranhänge, dann erstellle ich mit create das neue Objekt. Dann habe ich mir gedacht wenn ich das Array verkürze, gebe ich die nicht merh benötigten mit destroy wieder frei.

Delphi-Quellcode:
   
liste[listbox1.Count -1].Destroy;
setlength(liste,length(liste)-1);
(in Listbox1 und dem Array sind gleichviele Objekte)


Allerdings bekomme ich dann bei erneutem zugriff auf das array Probleme, beim zugriff auf das letzte Element. Meine frage ist jetzt wiso.

Liegt es daran, dass er mit destroy gleich das array einen kürzer macht?


schonmal danke für die Antworten


lg Knoby


oh merke grade ist ins falsche forum gerutscht ... tut mir leid ...

Cyf 21. Apr 2009 22:24

Re: Array objekte destroy?
 
Bist du sicher, dass bei deinem Zugriff die Arraylänge noch mindestens 1 beträgt?

[Edit]bzw. warum nimmst du die Länge einer Listbox und nicht die des Arrays?

Meflin 21. Apr 2009 22:25

Re: Array objekte destroy?
 
Nachdem du nicht mit Length(liste) arbeitest, drängt sich der Verdacht auf, dass eben einfach der Index dann nicht mehr stimmt. Wie äußern sich denn die Probleme?

Übrigens reicht es, das array einfach um eins zu verkürzen, um das letzte Element zu entfernen - der Speicher wird dann ja eh freigegeben ;)

Cyf 21. Apr 2009 22:28

Re: Array objekte destroy?
 
Zitat:

Zitat von Meflin
Übrigens reicht es, das array einfach um eins zu verkürzen, um das letzte Element zu entfernen - der Speicher wird dann ja eh freigegeben ;)

Was? Das sollte zu einem Speicherleck führen.

Muetze1 21. Apr 2009 22:31

Re: Array objekte destroy?
 
Zitat:

Zitat von Cyf
Was? Das sollte zu einem Speicherleck führen.

Richtig, da die Array Elemente ja explizit erzeugte Instanzen sind.

Aber warum nutzt du keine TObjectList anstatt einem Array? Dort kümmert sich diese automatisch um die Freigabe der Instanzen beim Überschreiben, Löschen der Elemente wie auch beim Clear der Liste.

quendolineDD 21. Apr 2009 22:41

Re: Array objekte destroy?
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von Cyf
Was? Das sollte zu einem Speicherleck führen.

Richtig, da die Array Elemente ja explizit erzeugte Instanzen sind.

Aber warum nutzt du keine TObjectList anstatt einem Array? Dort kümmert sich diese automatisch um die Freigabe der Instanzen beim Überschreiben, Löschen der Elemente wie auch beim Clear der Liste.

Dito. Dort kannst du ganz sicher sein, solang OwnObjects auf true ist, dass alle Elemente in der Liste auch aus dem Speicher entfernt werden, wenn sie gelöscht werden.

knoby 22. Apr 2009 07:32

Re: Array objekte destroy?
 
hey


jo danke das hat mir sehr geholfen, das mit dem Tobjectlist hatte ich auch schon überlegt, da ich aber noch nie so wirklich damit gearbeitet habe habe ich lieber arrays genommen werde es jetzt auf objectlist umschreiben


die probleme äußerten sich insoweit, dass ich nicht mehr auf das letzte objekt zugreifen konnte, also das nicht ein sondern zwei objekte weniger in dem array waren

jaenicke 22. Apr 2009 08:10

Re: Array objekte destroy?
 
Nebenbei: Den Destruktor (Destroy) sollte man (wie auch in der Hilfe steht) nie selbst direkt aufrufen, sondern Free benutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz