Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Was passiert mit nicht freigegeben Objekten? (https://www.delphipraxis.net/104663-passiert-mit-nicht-freigegeben-objekten.html)

xZise 8. Dez 2007 14:23


Was passiert mit nicht freigegeben Objekten?
 
Hi DP,
ich bin etwas ratlos, was Windows mit Objekten macht, die es nicht freigibt.

Nun ich denke mir: Sobald der Prozess beendet wurde (und damit alle dazugehörigen Threads), wird alles was der Prozess benötigt hat "freigegeben".

Aber mein Informatiklehrer vertritt die Meinung, das der Speicherbereich (jedenfalls ohne Reboot) nicht mehr verfügbar ist.
Ich hingegen frage mich, wie das gehen soll, weil irgendjemand müsste dann wissen, dass der Speicherbereich nicht mehr verfügbar ist.
Er geht sogar weiter, dass genilt werden muss (also "FreeAndNil" bzw. "FObject.Free; FObject := nil")!

Nun ist meine Frage, was passiert mit nicht freigegeben Objekten?

MfG
xZise

PS: Objekte, die nicht bis zum Ende existieren, sollten natürlich immer freigegeben werden.

PPS: Der Spezialfall Komponente ist ja nur: "Wenn FOwner freigegeben wird => alle Clients freigeben"?

Apollonius 8. Dez 2007 14:29

Re: Was passiert mit nicht freigegeben Objekten?
 
Dein Lehrer hat eindeutig Unrecht. Wenn der Prozess fertig ist, wird von Windows der gesamte Addressraum freigegeben, damit natürlich auch alle Objekte. Das selbe gilt für Handles, Windows dekrementiert automatisch deren Referenz-Zähler. Und Nillen ist natürlich vollkommen Quatsch - da es in Delphi keine Referenz-Zählung für Objekte gibt, ist dem Objekt völlig egal, ob es nocht Zeiger auf es gibt.

Martin K 8. Dez 2007 14:36

Re: Was passiert mit nicht freigegeben Objekten?
 
Ist es nicht sogar so, dass Objekte die in einer Methode (Prozedur oder Funktion) als lokale Variable sind und in dieser Methode erstellt werden auch am Ende dieser Methode wieder freigegeben werden, auch wenn man kein .Free o.ä. explizit aufruft?

Apollonius 8. Dez 2007 14:37

Re: Was passiert mit nicht freigegeben Objekten?
 
Nein, das stimmt nicht. Wenn du als lokale Variable einen Pointer hast und in der Routine GetMem aufrufst, wird der Zeiger auch nicht automatisch wieder freigegeben.

Dax 8. Dez 2007 14:38

Re: Was passiert mit nicht freigegeben Objekten?
 
Zitat:

Zitat von Martin K
Ist es nicht sogar so, dass Objekte die in einer Methode (Prozedur oder Funktion) als lokale Variable sind und in dieser Methode erstellt werden auch am Ende dieser Methode wieder freigegeben werden, auch wenn man kein .Free o.ä. explizit aufruft?

Du meinst Interfaces, dynamische Arrays und Strings - normale Objekte bleiben bestehen.

Die Muhkuh 8. Dez 2007 14:39

Re: Was passiert mit nicht freigegeben Objekten?
 
Zitat:

Zitat von Dax
Du meinst Interfaces, dynamische Arrays und Strings - normale Objekte bleiben bestehen.

Bis man sie zerstört oder das Programm schließt. ;-)

Luckie 8. Dez 2007 14:40

Re: Was passiert mit nicht freigegeben Objekten?
 
Zitat:

Zitat von Martin K
Ist es nicht sogar so, dass Objekte die in einer Methode (Prozedur oder Funktion) als lokale Variable sind und in dieser Methode erstellt werden auch am Ende dieser Methode wieder freigegeben werden, auch wenn man kein .Free o.ä. explizit aufruft?

Das ist falsch. Die Referenz geht verloren, aber der Speicher ist imme rnoch von dem Objekt belegt.

Was die Freigabe des Speichers und Windows angeht, hat dein Lehrer unrecht. So bald ein Prozess beendet wurde, gibt Windows alles wieder Frei: Benutzer-Objekte, GDI-Objekte und den Adressraum. Einzig das Prozess-Kernel-Objekt kann nopch weiterbestehen, wenn andere Prozesse noch geööfnete Handles auf das Objekt haben.

xZise 8. Dez 2007 14:43

Re: Was passiert mit nicht freigegeben Objekten?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nein xD
Das stimmt nicht :D In einen mörderischen Sebstversuch, habe ich Windows mal wieder zum swappen gebracht xD (Siehe Anhang)!

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  sl : TStringList;
  i : Integer;
begin
  sl := TStringList.Create;
  for i := 0 to MaxInt - 1 do
    sl.Add('1289704328423');
end;
Zitat:

Zitat von Luckie
Was die Freigabe des Speichers und Windows angeht, hat dein Lehrer unrecht. So bald ein Prozess beendet wurde, gibt Windows alles wieder Frei: Benutzer-Objekte, GDI-Objekte und den Adressraum. Einzig das Prozess-Kernel-Objekt kann nopch weiterbestehen, wenn andere Prozesse noch geööfnete Handles auf das Objekt haben.

Wie kriegt man geöffnete Handles hin?

MfG
xZise

PS: Wussts ich doch xD

Martin K 8. Dez 2007 14:49

Re: Was passiert mit nicht freigegeben Objekten?
 
Zitat:

Zitat von Luckie
Das ist falsch. Die Referenz geht verloren, aber der Speicher ist imme rnoch von dem Objekt belegt.

Hmm, und ich dachte bisher, dass auch der Speicher freigegeben würde.
Guter Programmierstil ist es natürlich, alles was man erzeugt auch wieder freizugeben!

Bernhard Geyer 8. Dez 2007 14:50

Re: Was passiert mit nicht freigegeben Objekten?
 
Zitat:

Zitat von Apollonius
Dein Lehrer hat eindeutig Unrecht.

Wenn der Lehrer aber imm noch auf Win 3.1 auf seinem Heimrechner hat, dann stimmt das Teilweise (jedenfalls für Ressourcen). :mrgreen: Aber neuerer Windows-Versionen wissen was ein Programm für Ressurcen belegt und kann diese bei Beendigung


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz