Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ArraySpeicher (https://www.delphipraxis.net/25544-arrayspeicher.html)

thaflo 8. Jul 2004 09:23


ArraySpeicher
 
Hallo!

Ich weiß, das Thema Array ist immer und immer wieder aufgetaucht, aber die bisherigen Themen (ja ich habe die Hilfe benutzt) konnten mir nicht helfen.

Ich habe ein Spiel, das zu Beginn einen dynamischen Array aus Farben hat.
Delphi-Quellcode:
clProgColors : Array of TColor;
Nun weiß ich zu Beginn nicht, ob ich 3 oder 10 Farben brauche, darum habe ich mich für das dynamische Array entschieden.
nachdem ich weiß, wie viele Farben ich brauche, setze ich den array dementsprechende:
Delphi-Quellcode:
SetLength(clProgColors,wievieleichbrauche);
Nun wird das Spiel neu gestartet, das heißt, ich muss den array löschen und warten, bis ich die neue anzahl der farben weiß.
Bei folgenden Lösungsversuchen bekommen ich trotzdem eine EAccessViolation, nicht nach dem ersten Mal, aber nach dem 2 oder 3 versuch, das spiel neu zu starten.
Delphi-Quellcode:
SetLength(clProgColors,0);
clProgColors:=nil;
Ich habe ein statisches Array mit 10 feldern gemacht, da lief es ohne Probleme, also *muss* der Fehler hier liegen.

Vilen dank für jegliche Hilfe und Tips.

Florian

alcaeus 8. Jul 2004 09:35

Re: ArraySpeicher
 
Ein Array ist eigentlich nur ein Pointer, der auf die Anfangsadresse der Elementreihe zeigt. Du setzt den Pointer auf nil. Wird nun danach nochmals SetLength aufgerufen oder auf das Array zuggriffen, so kriegst du eine ZV, da das Array irgendwo im Nirvana rumschwirrt. Schmeiß mal das
Delphi-Quellcode:
clProgColors:=nil;
raus, dann sollte es funktionieren

Greetz
alcaeus

DP-Maintenance 8. Jul 2004 09:38

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Windows API" nach "Object-Pascal / Delphi-Language" verschoben.
Kein Windows API Problem.

Eisenherz 8. Jul 2004 11:43

Re: ArraySpeicher
 
Zitat:

Zitat von alcaeus
Ein Array ist eigentlich nur ein Pointer, der auf die Anfangsadresse der Elementreihe zeigt. Du setzt den Pointer auf nil. Wird nun danach nochmals SetLength aufgerufen oder auf das Array zuggriffen, so kriegst du eine ZV, da das Array irgendwo im Nirvana rumschwirrt.

Die drei Aufrufe
Code:
  SetLength(clProgColors,0);
  clProgColors:=nil;
  Finalize(clProgColors);
machen letztendlich alle das Gleiche. Wenn man nil zuweist, dann wird nicht der Pointer auf nil gesetzt. Der Compiler weiß, dass es sich hier um ein dynamisches Array handelt und macht nichts weiter als den Code einzusetzen, der das dynamische Array leert.

Wenn man es im CPU-Fenster debuggt, dann landet man bei allen drei Methoden irgendwann in der Funktion @DynArrayClear.
Dann sieht man auch, dass die Variante mit dem nil zuweisen, die schnellste ist.

Muetze1 8. Jul 2004 13:13

Re: ArraySpeicher
 
Moin!

Die Methode mit der Nil Zuweisung hinterlässt Speicherlecks - die habe ich mal bei einem Projekt auf Arbeit gesucht und bei der Zuweisung gefunden. SetLength(, 0); macht das sauber.

MfG
Muetze1

Eisenherz 8. Jul 2004 16:38

Re: ArraySpeicher
 
Zitat:

Zitat von Muetze1
Die Methode mit der Nil Zuweisung hinterlässt Speicherlecks - die habe ich mal bei einem Projekt auf Arbeit gesucht und bei der Zuweisung gefunden. SetLength(, 0); macht das sauber.

Hast du ein Beispiel für ein solches Speicherleck. Ich habe in den Usergroups nach so einem Fall gesucht, aber keinen gefunden. Dafür bin ich immer wieder auf die Aussage gestoßen, dass SetLength(x,0) das gleiche wäre wie x := nil;


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