AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

dispose -> pointer = nil ?

Ein Thema von chaoslion · begonnen am 21. Sep 2006 · letzter Beitrag vom 21. Sep 2006
Antwort Antwort
chaoslion

Registriert seit: 1. Mär 2006
52 Beiträge
 
#1

dispose -> pointer = nil ?

  Alt 21. Sep 2006, 03:39
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
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#2

Re: dispose -> pointer = nil ?

  Alt 21. Sep 2006, 06:06
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
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: dispose -> pointer = nil ?

  Alt 21. Sep 2006, 08:39
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: dispose -> pointer = nil ?

  Alt 21. Sep 2006, 08:52
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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: dispose -> pointer = nil ?

  Alt 21. Sep 2006, 09:20
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

Re: dispose -> pointer = nil ?

  Alt 21. Sep 2006, 09:56
Zitat von Flocke:
Mal eine etwas "bildliche" Antwort:
Schönes Beispiel!
Uli Gerhardt
  Mit Zitat antworten Zitat
chaoslion

Registriert seit: 1. Mär 2006
52 Beiträge
 
#7

Re: dispose -> pointer = nil ?

  Alt 21. Sep 2006, 17:50
ok danke für eure Hilfe und gutes Beispiel!!
danke nochma *g*
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 Uhr.
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