Entwickler-Ecke
Sonstiges (Delphi) - Speicher wieder freigeben (Array löschen) 2
thommy f - Di 14.09.04 17:23
Titel: Speicher wieder freigeben (Array löschen) 2
Hallo,
langsam krieg ich an Anfall!
Das mit dem Array erzeugen funktioniert mittlerweile gut
aber wird der Speicherplatz für das Array mit
wirklich freigegeben?
Ich erstelle in einer Schleife mehrmals Arrays mit einer Variablen und dem Befehl:
Delphi-Quelltext
1:
| Setlength(Array,Variable); |
Dieses fülle ich automatisch in einer Schleife mit Zahlen und lese diese an einer anderen Stelle wieder aus.
Problem: Ich brauche diesen Ablauf ziemlich häufig. Und nachdem er mir trotz
Teilweise Inhalte bringt, die im aktuellen Array nicht stehen dürten (Zeiger steht auf korrekter Position) und irgendwann selbst 256 MB RAM nicht mehr ausreichen, hab ich das dumpfe gefühl, daß ich das Array zwar auf 0 setze, aber der Speicher nicht wirklich freigegeben wird.
Ist es möglich den Speicher den ein Array, das ich mit Setlength(Array,9); festlege definitiv wieder frei zu geben?
Wenn ja, BITTE WIE!?!
DANKE!!!
R E T T E T M I C H V O R D E R T O T A L E N V E R Z W E I F L U N G !!!
thebe - Di 14.09.04 17:38
Wenn Du z.b. ein Array of Integer haben möchtest, dann könntest Du statt Array of Integer ein Array of PInteger benutzen. Vorteil: Du kannst selbst bestimmen welche Plätze freigegeben werden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure ArrayInitialisieren; var myArray: Array of PInteger; i: integer; begin SetLength(myArray, WhatEverYouWant);
for i := 0 to WhatEverYouWant-1 do begin new(myArray[i]); myArray[i] := WhatEverNumberYouWant; end; end;
procedure ArrayFreigeben; var myArray: Array of PInteger; i: integer; begin for i := 0 to Length(myArray)-1 do dispose(myArray[i]);
SetLength(myArray, 0); end; |
So in etwa sollte das ausschauen..
UC-Chewie - Di 14.09.04 17:38
Versuch mal:
.Chef - Di 14.09.04 17:41
Füllst du die Arrays auch immer korrekt mit Werten wenn du sie vergrößerst? Wenn du die Länge vom Array auf 0 setzt, wird ja der Inhalt nicht verändert und bleibt auch da stehen, solange du oder eine andere Anwendung nix neues dahinschreiben. Wenn du also das Array unmittelbar danach wieder vergrößerst, hat es in der Regel immer noch den selben Inhalt.
Gruß,
Jörg
MrSaint - Di 14.09.04 19:45
UC-Chewie hat folgendes geschrieben: |
Versuch mal:
|
Das gibt den Speicher _nicht_ frei. Es löscht nur den Zeiger, der auf den Anfang des Arrays zeigt, der Speicher an sich bleibt aber reserviert. Da man aber den Zeiger auf das Array dann verloren hat, kann man es auch nicht mehr freigeben! Sowas sollte man also auf jeden Fall vermeiden, bei einem dynamischen Array dessen Größe > 0 ist!
Wollte ich nur noch so anhängen, nicht dass es da mißverständnisse gibt :)
MrSaint
UC-Chewie - Di 14.09.04 21:58
MrSaint hat folgendes geschrieben: |
UC-Chewie hat folgendes geschrieben: | Versuch mal:
|
Das gibt den Speicher _nicht_ frei. Es löscht nur den Zeiger, der auf den Anfang des Arrays zeigt, der Speicher an sich bleibt aber reserviert. Da man aber den Zeiger auf das Array dann verloren hat, kann man es auch nicht mehr freigeben! Sowas sollte man also auf jeden Fall vermeiden, bei einem dynamischen Array dessen Größe > 0 ist!
Wollte ich nur noch so anhängen, nicht dass es da mißverständnisse gibt :)
MrSaint |
Falsch ;) .
Würde hier wirklich nur ein Zeiger auf nil gesetzt werden, hättest du recht, aber dem ist nicht so. Wenn man sich den Assembler-Code ankuckt, der erzeugt wird, sieht man, dass
DynArrayClear aufgerufen wird, welches den Speicher des Arrays freigibt. Compiler Magic lässt grüßen :D
thommy f - Di 14.09.04 22:28
DANKE ! ! !
klappt!
* FREU * :D :D :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!