Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi := NIL ist gleich release? (https://www.delphipraxis.net/68261-%3D-nil-ist-gleich-release.html)

Mavarik 27. Apr 2006 08:25


:= NIL ist gleich release?
 
Hallo!

Ich lese öffter, das es in delphi möglich ist einfach einen Speicher wieder frei zu geben, indem man dem Zeiger auf NIL setzt.
Die C-Jungs müssen scheinbar noch manuell den release aufrufen?!

Ich rede nicht von .Net wo die Speicher-Abfallbeseitigung das erledigt :lol:

Habe ich da etwas verpasst? Oder wie funktioniert das?

Frank :coder:

Angel4585 27. Apr 2006 08:30

Re: := NIL ist gleich free?
 
Also ich war der Meinung das wenn man was = nil setzt, das dann die Variable zwar auf nil zeigt, das eigentliche Objekt doer was auch immer immernoch im Speicher existiert.. :gruebel:

angos 27. Apr 2006 08:34

Re: := NIL ist gleich free?
 
Zitat:

Zitat von Angel4585
Also ich war der Meinung das wenn man was = nil setzt, das dann die Variable zwar auf nil zeigt, das eigentliche Objekt doer was auch immer immernoch im Speicher existiert.. :gruebel:

und genau das ist richtig. Nil nimmt nur den Pointer weg, der Speicherplatz ist noch immer belegt.

mkinzler 27. Apr 2006 08:43

Re: := NIL ist gleich free?
 
Das Setzten auf Nil verschlimmbessert die Sache, weil nun die automatische Freigabe durch den Destruktor des Owner auch nicht mehr funktioniert, weil dieser meinet das Objekt sei schon zerstört, da Referenz NIL ist.

dfried 27. Apr 2006 08:46

Re: := NIL ist gleich free?
 
Zitat:

Zitat von Mavarik
Ich lese öffter, das es in delphi möglich ist einfach einen Speicher wieder frei zu geben, indem man dem Zeiger auf NIL setzt.

Naja, für Objekte wäre das nicht so toll (wie schon die anderen auch beschrieben haben). Bei Interfaces wäre diese vorgehensweise OK.

Ralf Kaiser 27. Apr 2006 08:48

Re: := NIL ist gleich free?
 
Zitat:

Zitat von Mavarik
Hallo!

Ich lese öffter, das es in delphi möglich ist einfach einen Speicher wieder frei zu geben, indem man dem Zeiger auf NIL setzt.
Die C-Jungs müssen scheinbar noch manuell den Free aufrufen?! Bzw. release.

Ich rede nicht von .Net wo die Speicher-Abfallbeseitigung das erledigt :lol:

Habe ich da etwas verpasst? Oder wie funktioniert das?

Frank :coder:

Hallo,

wenn das betreffende Objekt ein Interface implementiert (also z.B. eine Instanz eines COM-Servers ist) dann macht Delphi eine Referenzzählung. Das heisst, daß das Objekt freigegeben wird wenn die letzte Referenz auf NIL gesetzt wird, also von der Wirkung her wie bei dot-net-Objekten.

Bei "normalen" Objekten trifft das nicht zu. Diese müssen explizit freigegeben werden.

Ciao,
Ralf

Mavarik 27. Apr 2006 08:55

Re: := NIL ist gleich free?
 
Zitat:

Hallo,

wenn das betreffende Objekt ein Interface implementiert (also z.B. eine Instanz eines COM-Servers ist) dann macht Delphi eine Referenzzählung. Das heisst, daß das Objekt freigegeben wird wenn die letzte Referenz auf NIL gesetzt wird, also von der Wirkung her wie bei dot-net-Objekten.

Bei "normalen" Objekten trifft das nicht zu. Diese müssen explizit freigegeben werden.

Ciao,
Ralf
OK Sorry! Natürlich geht es um interfaces!!

Wie funktioniert das? Wer zählt den da mit, wenn ein Pointer auf NIL gesetzt wird?

Frank

PS. Habe den Titel geändert!

Bernhard Geyer 27. Apr 2006 09:55

Re: := NIL ist gleich free?
 
Zitat:

Zitat von Mavarik
Wie funktioniert das? Wer zählt den da mit, wenn ein Pointer auf NIL gesetzt wird?

Das ist Compiler-Magic. Der Compiler hat für Interfaces eine automatische Referenzzählung implementiert die dafür sorgt wenn der Referenzzähler auf 0 geht das das Objekt freigegeben wird. Ich denke wenn Du den Assembler-Code anschaust wird für eine einfache := Nil-Zuweisung noch einiges an Code aufgerufen.

xaromz 27. Apr 2006 10:02

Re: := NIL ist gleich free?
 
Hallo,
Zitat:

Zitat von Bernhard Geyer
Ich denke wenn Du den Assembler-Code anschaust wird für eine einfache := Nil-Zuweisung noch einiges an Code aufgerufen.

So viel ist das nicht. Eigentlich wird nur _Release aufgerufen.
Nochmal zum Verständnis:
Jedesmal, wenn eine neue Referenz auf ein Interface erzeugt wird, sorgt Delphi dafür, dass die Methode _AddRef des Interface aufgerufen wird. Beim Entfernen der Referenz (auf nil setzen, Scope verlassen) wird automatisch _Release aufgerufen. Deshalb sind z. B. Funktionen mit einem try..Finally umgeben. Im Finally wird _Release für alle lokalen Referenzen aufgerufen.
Da das alles die Compiler-Magic macht, bekommt der Programmierer davon normalerweise nichts mit.

Gruß
xaromz

Robert Marquardt 27. Apr 2006 10:19

Re: := NIL ist gleich release?
 
Anmerkung string- und "array of"-Variablen werden genauso behandelt. Der einzige Unterschied ist das nicht die COM-Objekt-Referenzzaehlung sondern die Delphi-eigene Referenzzaehlung fuer diese Typen zum Zuge kommt.


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

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