Autor Beitrag
thommy f
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: Di 14.09.04 17:23 
Hallo,

langsam krieg ich an Anfall!

Das mit dem Array erzeugen funktioniert mittlerweile gut

aber wird der Speicherplatz für das Array mit

ausblenden Delphi-Quelltext
1:
Setlength(Array,0);					


wirklich freigegeben?

Ich erstelle in einer Schleife mehrmals Arrays mit einer Variablen und dem Befehl:

ausblenden 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

ausblenden Delphi-Quelltext
1:
Setlength(Array,0);					


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Di 14.09.04 17:38 
Versuch mal:
ausblenden Delphi-Quelltext
1:
Array := nil;					

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: 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

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 14.09.04 19:45 
UC-Chewie hat folgendes geschrieben:
Versuch mal:
ausblenden Delphi-Quelltext
1:
Array := nil;					


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

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Di 14.09.04 21:58 
MrSaint hat folgendes geschrieben:
UC-Chewie hat folgendes geschrieben:
Versuch mal:
ausblenden Delphi-Quelltext
1:
Array := nil;					


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

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
thommy f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: Di 14.09.04 22:28 
DANKE ! ! !

klappt!

* FREU * :D :D :D