heap bereinigung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
slai
Beiträge: 211
Registriert: Fr 27. Apr 2007, 17:36
Wohnort: Zürich
Kontaktdaten:

heap bereinigung

Beitrag von slai »

Hallo zusammen

gibt es in freepascal eine möglichkeit den heap zu bereinigen, so im stiel des CarbageCollector in Java?

danke für antworten
gruss

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Sauber Programmieren und alles nicht benötigte freigeben, dann ist der Heap immer "rein" ;-)

Strings und Dynamische Arrays werden automatisch freigegeben. Diese kann man auch mit Finalize explizit freigeben, muss man aber nicht.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Wenn Du mit "Bereinigen" nicht meinst dass die Elemente entfernt werden sollen, die der Programmierer vergessen hat zu entfernen (wir sind hier nicht in einer .NET Umgebung, die über die Verwendung durch den Programmierer von Objekten Buch führt und dafür zusätzliche Ressourcen verbrät), sondern eine "Heap-Defragmentierung" ansprichst: Das geht nicht, weil überall im Programm Pointer auf im Heap liegende Elemente gehalten werden und man diese also nicht hinterrücks verschieben kann.

-Michael

slai
Beiträge: 211
Registriert: Fr 27. Apr 2007, 17:36
Wohnort: Zürich
Kontaktdaten:

Beitrag von slai »

Hy theo und mschnell

Danke für die antworten.
mschnell: Ich meinte eigendlich schon das erste also das entfernen von elementen die der Programmierer vergessen hat, habe jedoch nun das problem gefunden das mir mein ram zumüllt, das währe dann der punkt sauber Programmieren von theo :-)

Nun habe ich aber trozdem noch eine frage, ich habe eine Funktion die mir mit result := TZTable(...) irgend ein table meines datamods zurückgibt. Nun ist jedoch (glaube ich zumindest) das problem das mir die funktion jedesmal wenn es mir ein Table zurückgibt eine neue instanz desjenigen erzeugt. Wie kann ich einenPointer auf das jeweilige Table zurückgeben, gibt es da irgendein tutorial oder anleitung wie man in freepascal mit pointern arbeiten kann?

danke für die antworten
Windows 7, Lazarus 0.9.28.2 fpc 2.2.4, Firebird 2.1, Zeoslib 6.6.6-stable

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Eine Lösung währe den Rückgabe wert aufzufangen und wenn dieser nicht mehr gebraucht wird, einfach die klasse über free z.b. freigeben.

Damit müsste meine ich auch die Instans in der Funktion frei geben werden. Da es ja Pointer sind.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

result := TZTable(...)

erzeugt garantiert keine neue instanz der tabelle
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

nein so nicht, aber um was zurückzugeben z.b. eine TStringlist muss sie ja erstmal erzeugt werden...
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

das kann man ja aber auch umgehen, als Procedure und der Übergabe mit var, dann kannst du sie vor Aufruf erstellen, danach auswerten und freigeben.

Code: Alles auswählen

procedure...;
begin
  TObject... := TObject...CREATE;
  Rückgabe(Tobject...);
  TObject...Free;
end;
 
procedure Rückgabe(var TRückgabe: TObject...)
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Irgendwie stellt "deine" code Higleiter Funktion einige Schlüsselwörter falsch da wie z.b. begin end, und var *G*.

Aber dann währe es keine Funktion mehr...var Parameter sind wirklich Praktisch..
MFG
Michael Springwald

Antworten