Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dispose -> pointer = nil ? (https://www.delphipraxis.net/77551-dispose-pointer-%3D-nil.html)

chaoslion 21. Sep 2006 02:39


dispose -> pointer = nil ?
 
Hallo Leute!

Mal eine ganz bescheidene Frage aber setzt Dispose nach erfolgreicher Freigabe des
Speichers den Pointer auf nil oder wie kann man sonst erkennen ob Speicher erfolgreich
freigegeben wurde?!

mfG
lioN

_frank_ 21. Sep 2006 05:06

Re: dispose -> pointer = nil ?
 
der Pointer selbst wird, wie bei free, nicht auf nil gesetzt.
das musst du manuell machen. Wenn du das nicht tust, kannst du nicht herausfinden, ob der pointer noch gültig ist (außer vielleicht per try except).

Gruß Frank

Jürgen Thomas 21. Sep 2006 07:39

Re: dispose -> pointer = nil ?
 
Für diese Prüfung ist Folgendes vorgesehen (ich weiß aber nicht, ob damit alle denkbaren Probleme abgehandelt werden):
Delphi-Quellcode:
if assigned(StringList1)
begin
  //  ...
end;
Gruß Jürgen

Der_Unwissende 21. Sep 2006 07:52

Re: dispose -> pointer = nil ?
 
Zitat:

Zitat von Jürgen Thomas
Für diese Prüfung ist Folgendes vorgesehen (ich weiß aber nicht, ob damit alle denkbaren Probleme abgehandelt werden):
Delphi-Quellcode:
if assigned(StringList1)
begin
  //  ...
end;

Nein! Das ist hier völlig falsch. Assigned prüft nur ob eine Variable eine gültige Referenz darstellt. Dazu wird ein Zeiger auf die Ungleichheit mit nil geprüft. Da es ziemlich genau 2^32 Adressen (auf einem 32 Bit System) gibt, die möglich sind und davon genau eine nil ist, sind die Chancen also gut hier ein assigned(X) = True zu bekommen.
Gerade bei lokalen Variablen ist das ein Problem, diese werden nämlich nicht initialisiert (gibt aber auch ein Warning und steht in der OH).
Delphi-Quellcode:
procedure doFoo;
var x : ^Integer;
begin
  // hm, ist x assigned? 
  // hier wurde noch keine gültige Adresse zugewiesen,
  // trotzdem kann in jedem Durchlauf diese Bedingung wahr werden
  // da die Werte lokaler Adressen zufällig sind, weiß man nie was drin steht
  // bis es zugewiesen wurde
  if assigned(x) then
  begin
  ...
  end;


  new(x);
  // ok, jetzt hat x eine gültig Adresse
  dispose(x);
  // und die bleibt gespeichert, auch wenn der Speicher an dieser
  // Adresse schon wieder frei gegeben wurde
  if assigned(x) then
  begin
    // ist wahr!
  end;
end;
Dispose und Free kümmern sich, wie _frank_ schon sagte nur um das freigeben des Speichers. Dies liegt schon allein daran, dass du mehr als einen Zeiger auf den gleichen Adressbereich haben kannst. Bei Klassentypen wäre das natürlich mehr als eine Referenz. Hier gibt nur keine map, in der alle Zeiger auf eine Adresse gespeichert werden (zu der Adresse). Somit kann der Speicher an dieser Adresse frei gegeben werden, aber dein Programm kennt nicht alle Zeiger/Referenzen auf diesen Bereich und setzt diese deswegen auch nicht auf nil. Dass solltest du also explizit im Code machen.

Gruß Der Unwissende

Flocke 21. Sep 2006 08:20

Re: dispose -> pointer = nil ?
 
Mal eine etwas "bildliche" Antwort: :???:

Stelle dir einen Zeiger wie eine Telefonnummer vor, die vielleicht nur in einem, möglicherweise aber in hunderten von Telefonbüchern und -listen steht. Wenn du dein Telefon jetzt abmeldest (=> du gibst den Speicher frei) bzw. deine Nummer sich ändert (=> du änderst die Größe mit ReallocMem), dann ändert sich deine Nummer in allen Listen ja auch nicht automatisch und von Geisterhand. Ähnlich ist es mit Zeigern: das System merkt sich nicht, wo überall ein Verweis (=> ein Zeiger) darauf verwendet wird.

uligerhardt 21. Sep 2006 08:56

Re: dispose -> pointer = nil ?
 
Zitat:

Zitat von Flocke
Mal eine etwas "bildliche" Antwort: :???:

Schönes Beispiel! :-) :thumb:

chaoslion 21. Sep 2006 16:50

Re: dispose -> pointer = nil ?
 
ok danke für eure Hilfe und gutes Beispiel!!
danke nochma *g*


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr.

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-2025 by Thomas Breitkreuz