Autor Beitrag
bms
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Mi 11.02.04 10:31 
Wenn ich im Program ein Objekt (globale Variable) erstelle

ausblenden 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

ausblenden Quelltext
1:
Bitmap.Free;					


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mi 11.02.04 10:48 
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 user profile iconDeCodeGuru: BBCode korrigiert

_________________
Ist Zeit wirklich Geld?
bms Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Mi 11.02.04 13:09 
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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 11.02.04 13:26 
Du sollst auch nicht raten, sondern denken. ;)
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!