![]() |
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 |
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 |
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:
Gruß Jürgen
if assigned(StringList1)
begin // ... end; |
Re: dispose -> pointer = nil ?
Zitat:
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:
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.
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; Gruß Der Unwissende |
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. |
Re: dispose -> pointer = nil ?
Zitat:
|
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