AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Verständnisfrage Assigned vs nil

Ein Thema von Delbor · begonnen am 30. Nov 2019 · letzter Beitrag vom 5. Dez 2019
Antwort Antwort
Seite 3 von 4     123 4   
hoika
Online

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.378 Beiträge
 
Delphi XE4 Professional
 
#21

AW: Verständnisfrage Assigned vs nil

  Alt 2. Dez 2019, 15:10
Hallo,
Zitat:
weiterhin eine Speicheradresse, nur ist dort nicht mehr das drin,
Einspruch, setzt testweise einen Breakpoint genau dahinter,
der Zugriff auf das freigegebene Objekt kann noch funktionieren,
gerade, wenn es auf dem Stack liegt (lokales Objekt).

Es muss aber auch nicht funktionieren.
Heiko
  Mit Zitat antworten Zitat
DasWolf

Registriert seit: 7. Jun 2016
Ort: Neubrandenburg
41 Beiträge
 
Delphi 10.1 Berlin Professional
 
#22

AW: Verständnisfrage Assigned vs nil

  Alt 2. Dez 2019, 15:18
Wenn ich ein Objekt nach der Freigabe im Code nachher auf Nil testen muss, dann habe ich was falsch gemacht. Wir hatten hier mal die Diskussion warum FreeAndNil schlechter Stil ist. Vielleicht findet die noch jemand. Da würde das sehr schlüssig erklärt von einem Mitglied.
Es gibt nicht nur Schwarz und Weiß, wie sowas hier:

Delphi-Quellcode:
procedure Test;
var
  o: TMyObj;
begin
  o := TMyObj.Create;
  try
    ...
    ...
  finally
    o.Free;
  end;
end;
Deshalb rate ich jedem, immer zu prüfen, egal ob es unnötig erscheint oder nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.357 Beiträge
 
Delphi 10.3 Rio
 
#23

AW: Verständnisfrage Assigned vs nil

  Alt 2. Dez 2019, 16:33
Die Diskussion hatte IMHO der gute Nick Hodges in seinem Blog gestartet beendet. Aber Multithreaded glaube ich nicht an die pauschale Gültigkeit dieser Aussage.

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.977 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#24

AW: Verständnisfrage Assigned vs nil

  Alt 2. Dez 2019, 17:46
Eine Variable mit einem Objekt während der Lebenszeit dieser Variable.
Free reicht, wenn nach dem Free nicht mehr auf die Variable zugegriffen wird.
Gibt es aber mehrere Stellen wo erstellt oder freigegeben wird, dann muß die Variable auch auf nil gesetzt werden.

Eine Variable wo während der Laufzeit mehrere Objekte drin gespeichert/verlinkt sind und zwischendurch auch mal nichts drin stehen kann, dann ebenfalls nil setzen.
Ob nun FreeAndNil oder Free plus :=nil das sei jedem selbst überlassen.

Immer FreeAndNil, falls ich mal irgendwo scheiße bau und nicht mehr weiß was ich wo mache = schwachsinn sinnlos, siehe Nicks Blog.

Aber hier *muss* nil gesetzt werden,
am Besten via FreeAndNil, falls es im Free/Destroy knallen kann, sonst knallt es bestimmt nochmal beim letzten Free und schrottet mir die originale Fehlermeldung/Fehlerposition.
Delphi-Quellcode:
o := TMyObj.Create;
try
  ...
  FreeAndNil(o);
  ...
finally
  o.Free; // hier ist intern ein IF ASSIGNED(SELF) drin
end;
Delphi-Quellcode:
o := nil; // genauso, wie das hier nicht vergessen werden darf
try
  ...
  o := TMyObj.Create;
  ...
  FreeAndNil(o);
  ...
finally
  o.Free; // hier ist intern ein IF ASSIGNED(SELF) drin
end;
@DasWolf: Jupp, also wie gesagt, wird nach dem Free nochmal irgendwie auf den Inhalt zugegriffen, dann NIL nicht vergessen zu setzen.


Und auf die grauenhaften Besonderheiten im NextGen will jetzt niemand eingehen. (ich sag nur "Free" macht garnichts und Objekte werden nicht da freigegeben wo und wann ich es will/erwarte)



PS: Wäre der Compiler intelligent genug und täte beim .Free oder .Destroy den Status der Variable zurück auf "nicht initilisiert" setzen,
wann gäbe es hier
Delphi-Quellcode:
x.Free;
if Assigned(X) then

// oder
x.Free;
x.irgendwas;
eine der bekannten Warnungen, beim nachfolgenden Zugriff. (Variable nicht initialisiert)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 2. Dez 2019 um 17:53 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
628 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#25

AW: Verständnisfrage Assigned vs nil

  Alt 2. Dez 2019, 17:56
Bitte lasst doch die Diskussion, die wurde schon gefühlt tausendfach geführt.
Es geht hier doch um Assigned vs nil
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.977 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#26

AW: Verständnisfrage Assigned vs nil

  Alt 2. Dez 2019, 17:59
Hallo,
Zitat:
weiterhin eine Speicheradresse, nur ist dort nicht mehr das drin,
Einspruch, setzt testweise einen Breakpoint genau dahinter,
der Zugriff auf das freigegebene Objekt kann noch funktionieren,
gerade, wenn es auf dem Stack liegt (lokales Objekt).

Es muss aber auch nicht funktionieren.

Objekte liegen nicht auf dem Stack (außer manchmal deren Variable),
aber ja, wenn der speichermanager das Block noch nicht freigeben und auch noch nicht anders wiederverwendet hat, dann stimmt es natürlich.

PS: Darum gibt es in einigen Speichermanagern/Debuggingtools eine Option ala "markiere freigegeben Speicher" (fülle mit hübschen Bytes), bzw. notfalls auch "leere/nulle freigegebenen Speicher", um solche Fehler leichter finden zu können.
(z.B. im großen FastMM)
Aber bei Speicher wurde bereits neu vergeben, dagegen ist ein Kraut gewachsen, drum hilft sowas nur bedingt. (außer man bringt den Speichermanager dazu den Speicher nicht freizugeben oder neuzuvergeben, aber dann wird der Speicher schnell voll)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 2. Dez 2019 um 18:04 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
2.222 Beiträge
 
Delphi 10.3 Rio
 
#27

AW: Verständnisfrage Assigned vs nil

  Alt 3. Dez 2019, 07:14
Also ich habe eine einfache Regel: IMMER Assigned() benutzen ...

Wozu = nil benutzen ? Das bringt doch nur zusätzliche Fehlermöglichkeiten rein.

Der einzige Nachteil ist, das mehr Buchstaben zu schreiben sind
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.184 Beiträge
 
Delphi 10.3 Rio
 
#28

AW: Verständnisfrage Assigned vs nil

  Alt 3. Dez 2019, 10:16
Also ich habe eine einfache Regel: IMMER Assigned() benutzen ...
Sieh mal an, ich habe da eine ganz andere Sichtweise: Assigned verwende ich nur bei Methodenzeigern, weil ich dann gleich sehe, dass es ein Methodenzeiger ist.
Ist halt alles Geschmackssache...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
2.222 Beiträge
 
Delphi 10.3 Rio
 
#29

AW: Verständnisfrage Assigned vs nil

  Alt 3. Dez 2019, 12:58
Ja ich bin wohl noch jemand der versucht allen Dingen eindeutige Namen zu geben,
deshalb sehe ich sofort ob es Methoden, Felder, Parameter, etc..

Aber so hat eben jeder seine Macke
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.184 Beiträge
 
Delphi 10.3 Rio
 
#30

AW: Verständnisfrage Assigned vs nil

  Alt 3. Dez 2019, 13:23
Ja ich bin wohl noch jemand der versucht allen Dingen eindeutige Namen zu geben,
deshalb sehe ich sofort ob es Methoden, Felder, Parameter, etc..
Na ja, ein Feld oder Parameter kann ja sowohl eine Objekt-Instanz als auch ein Methodenzeiger sein. Der Name AfterPost kann somit sowohl eine Methode als auch einen Event bezeichnen ohne dass an der Benennung auf den ersten Blick etwas auszusetzen wäre. Setzt man auch noch das vorgestellte F für Felder oder A für Parameter voraus, dann kann je nach Kontext FAfterPost aber auch eine Instanzvariable sein, die zu einer Gruppe von ähnlichen Variablen gehört. Der Name einer Variablen sagt ja erstmal nichts über den Typ aus. Soll es ja auch nicht, denn sonst müsste ich ja beim Ändern des Typs immer den Namen mitändern.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 14:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf