PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Pascal/Delphi] Free / Destroy bei lokalen Klasseinstanzen notwendig?


Kabelsalat
2006-06-07, 22:36:15
Hallo,

Als ein an Garbage Collectoren gewöhnter Mensch muss man sich jedes mal neu an Umgebungen gewöhnen, die einem diesen Komfort nicht geben. Aus diesem Grund bin ich mir nicht sicher, ob ich mir folgendes nicht sparen könnte:


procedure TXyz.Xyz();
var
MyClass: TMyClass;
begin
MyClass := TMyClass.Create();

//[...]

MyClass.Free(); //überflüssig, da lokal? Würde MyClass.Destroy() reichen?
end;


Danke für die Unterstützung

Kabelsalat

Ganon
2006-06-07, 22:49:17
Nein. Afaik sind Klassen-Instanzen in ObjectPascal IMMER Pointer.

Lokale Objekte wären kein Type "Class" sondern vom Type "Object".

Kabelsalat
2006-06-07, 22:53:10
Verstehe ich nicht ganz. Gerade da es Pointer sind, muss ich den Speicher ja freigeben. Nun sollten lokale Variablen auf dem Stack abgelegt werden und daher auf Kurz oder Lang so oder so platt gemacht werden, aber bei Klassenvariablen / Objekten könnte eben noch belegter Speicher auf dem Heap hinzukommen, welcher nur durch Aufruf des Destructors freigegeben wird. Daher ist der Aufruf des Destruktors (bzw. Free) notwendig, es sei denn Delphi ruft diesen bei lokalen Variablen / Objekten automatisch auf....

Senior Sanchez
2006-06-07, 23:00:01
Kabelsalat[/POST]']Verstehe ich nicht ganz. Gerade da es Pointer sind, muss ich den Speicher ja freigeben. Nun sollten lokale Variablen auf dem Stack abgelegt werden und daher auf Kurz oder Lang so oder so platt gemacht werden, aber bei Klassenvariablen / Objekten könnte eben noch belegter Speicher auf dem Heap hinzukommen, welcher nur durch Aufruf des Destructors freigegeben wird. Daher ist der Aufruf des Destruktors (bzw. Free) notwendig, es sei denn Delphi ruft diesen bei lokalen Variablen / Objekten automatisch auf....

Hast dir selbst schon die Antwort gegeben.
Musste freimachen, weil es ansonsten verlorener Speicherplatz ist: Den Pointer haste nicht mehr, also kannste später auch nichts mehr freigeben. Und da der Heap unabhängig von der aktuellen Methode ist, sollte somit nicht benötigter Speicherplatz freigegeben werden.

Kabelsalat
2006-06-07, 23:01:06
Du bist dir also sicher, dass Delphi den Aufruf des Destruktors nicht für mich übernimmt?

Ganon
2006-06-07, 23:04:34
Kabelsalat[/POST]']Verstehe ich nicht ganz. Gerade da es Pointer sind, muss ich den Speicher ja freigeben.

Sorry, aber du hast 2 Fragen gestellt. Ein mal in der Überschrift und einmal im Quelltext. Genauer:

"Nein, free() ist nicht überflüssig". ;)

MyClass ist nur ein Pointer auf das Objekt. Wenn die Methode verlassen wird, fliegt der Pointer weg, aber das Objekt schwirrt noch irgendwo im Speicher. ;) Von daher entweder das Objekt löschen, oder einen "globaleren" Pointer darauf zeigen lassen. ;)

Kabelsalat
2006-06-07, 23:06:33
OK. Jetzt ist's klar. Danke.

Senior Sanchez
2006-06-07, 23:06:54
Kabelsalat[/POST]']Du bist dir also sicher, dass Delphi den Aufruf des Destruktors nicht für mich übernimmt?

Da bin ich mir ziemlich sicher.
Habe mal gegoogled: http://www.e-strube.net/web/praxissoftware/diplom/kapit2c.htm

Zitat:

"Statische Objekte werden, wie alle anderen statischen Variablen auch, automatisch freigegeben, sobald ihr Gültigkeitsbereich verlassen wird.

Beachtet werden muß jedoch, daß dynamisch erzeugte Objekte vom Programmierer selbst wieder freigegeben werden müssen, da sonst mit der Zeit Speicher-Löcher (=unbenutzter, nicht freigegebener Speicher) entstehen. Eine Einbettung in einem try/finally-Ressourcenschutzblock des Codes, der auf dynamisch erzeugte Objekte zugreift, ist ratsam, um eine sichere Freigabe des belegten Speichers zu erwirken. "

Kabelsalat
2006-06-07, 23:09:34
OK. Dann werde ich meinen Code nochmal auf Memoryleaks überprüfen müssen :(

Ganon
2006-06-07, 23:12:04
Steht auch alles ganz gut in der FreePascal-Referenz-Doku beschrieben. :)

edit:
ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf

Senior Sanchez
2006-06-07, 23:15:42
Kabelsalat[/POST]']OK. Dann werde ich meinen Code nochmal auf Memoryleaks überprüfen müssen :(

Wenn man nen GC immer hat, dann macht man sich über sowas halt keine Gedanken ;)

Der Tipp den man immer wieder liest und den man echt beherzigen sollte ist, dass Wer Speicher anfordert, hat ihn auch wieder freizugeben.

Kabelsalat
2006-06-07, 23:20:51
Man kann sich die Entwicklungsumgebung leider nicht immer selber aussuchen - sonst wäre meine Wahl ganz klar auf C# gefallen. Auch gegen Java hätte ich mich nicht gesträubt... aber was soll's. Noch ist's bloß ein kleines Test-Programm bei dem etwaige MemLeaks nicht sonderlich stören und das ganze kommt gerade ganz geschickt, denn ohne ab und zu an nicht GC-Umgebungen erinnert zu werden, vergisst man das Aufräumen demnächst auch bei wichtigeren Apps.