Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Muß man selbsterstellte Objekte wieder freigenben?
bms - Mi 11.02.04 10:31
Titel: Muß man selbsterstellte Objekte wieder freigenben?
Wenn ich im Program ein Objekt (globale Variable) erstelle
Quelltext
1:
| Bitmap := TBitmap.Create; |
dann muß ich es irgendwann wieder freigeben.
Muss ich aber für den Fall, dass das Programm vorher durch Close beendet wird, auch in OnClose oder Finalization Teil des Formulars ein
eingeben? Oder werden alle erstellten Objekte am ende des Programms wieder entfernt, so wie Delphi es beispielweise mit dem Komponenten macht? Das Problem ist, daß ich das Objekt nicht immer erstelle. In der Regel ist es aber so, dass es wieder freigegeben wird. Aber man kann durchaus auch zwischendurch das Programm beenden.
AndyB - Mi 11.02.04 10:48
Titel: Re: Muß man selbsterstellte Objekte wieder freigenben?
bms hat folgendes geschrieben: |
OnClose |
OnClose is der ungeeignetste Ort für die Freigabe, da z.B. Application.Terminate OnCloseQuery und OnClose umgeht. Ein besserer Platz wäre OnDestroy. Wenn du die globale Variable in einem
initialization Abschnitt erzeugst, ist die Freigabe höchstwahrscheiblich auch im
finalization Abschnitt zu erldeigen (kommt aber auf den speziellen Fall an).
Zitat: |
Oder werden alle erstellten Objekte am ende des Programms wieder entfernt, so wie Delphi es beispielweise mit dem Komponenten macht? |
Komponenten haben einen
Owner (Komponenten-Besitzer). Ein TBitmap hat keinen. Die Schlussfolgerung überlasse ich dir.
Zitat: |
Aber man kann durchaus auch zwischendurch das Programm beenden. |
Dann solltest du
FreeAndNil(GlobaleVariable) benutzen.
Moderiert von
DeCodeGuru: BBCode korrigiert
bms - Mi 11.02.04 13:09
Titel: Re: Muß man selbsterstellte Objekte wieder freigenben?
AndyB hat folgendes geschrieben: |
Die Schlussfolgerung überlasse ich dir. |
Ich mag keine Ratespiele. Deshalb gucke ich auch keine Gameshows.
Ich schätze aber, dass es bedeutet, dass man den Speicher selbst freigeben muss.
Delete - Mi 11.02.04 13:26
Du sollst auch nicht raten, sondern denken. ;)
Delete - Mi 11.02.04 21:43
Mach ich auch immer unter Finalization.
Strenggenommen verfällt beim schließen der Anwendung allerdings sowieso aller aus dem Heap bezogener Speicher.
Man spart also höchstens dem Garbage Collector von Windows etwas arbeit.
Wichtig ist halt, wie von bms gesagt, dass du zur Laufzeit erzeugte Komponenten, die du zur Laufzeit schon nicht mehr brauchst, auch freigibst, damit sie keinen Speicher mehr beanspruchen.
galagher - Sa 13.03.04 13:03
Brainiac hat folgendes geschrieben: |
Strenggenommen verfällt beim schließen der Anwendung allerdings sowieso aller aus dem Heap bezogener Speicher. |
Das bedeutet also, dass es im Grunde völlig egal ist, ob man überhaupt etwas freigibt, da Windows beim Beenden der Anwendung das sowieso tut?! So verstehe ich das jedenfalls: Während der Laufzeit kann man Speicher "sparen", indem man freigibt, man MUSS aber nicht. Ist das so?
Delete - Sa 13.03.04 13:35
Bezüglich des Speichers kann man das prinzipiell so sagen, sehr professionell ist es halt nur nicht.
Du solltest bedenken, dass manche spezielle Komponenten sich für irgendwelche Funktionen in Windows oder intern in deiner Anwendung anmelden und sich erst bei ihrer Zerstörung wieder abmelden. Wenn sie nicht zerstört werden, kann das theoretisch zu unvorhergesehenem Verhalten führen oder unnötige Rechenzeit verschwenden.
Auch hier führt Windows natürlich intelligente Schutzprüfungen durch, um dies weitestgehend auszuschließen.
Es ist halt so: Prinzipiell musst du deinen PC auch zum Ausschalten nicht unbedingt herunterfahren. Auch wenn du einfach den Stecker ziehst, wird er beim nächsten mal mit an Sicherheit grenzender Wahrscheinlichkeit wieder ganz normal booten. Man macht es halt, um auch für wirklich alle Eventualitäten gewapnet zu sein, egal, was gerade auf dem System ablaufen mag und zuerst beendet werden sollte.
galagher - Sa 13.03.04 13:40
Brainiac hat folgendes geschrieben: |
Bezüglich des Speichers kann man das prinzipiell so sagen, sehr professionell ist es halt nur nicht.
|
Danke für deine Auskunft! Klar verwende auch ich Free in meinen Programmen, nur manchmal bin ich mir nicht so 100%-ig sicher, besonders bei dynamisch erzeugten TForms. Ist jedenfalls schon mal beruhigend zu wissen, daß Windows das tut!
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!