AGB  ·  Datenschutz  ·  Impressum  







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

[FM] Free auf nil wird zu self.free

Ein Thema von Darlo · begonnen am 1. Mär 2012 · letzter Beitrag vom 2. Mär 2012
Antwort Antwort
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:01
Dass der Code fehlerhaft ist, ist mir durchaus klar. Sollte ja
auch nur ein vereinfachtes Beispiel dazu sein...

Mir scheint es, dass nicht initialisierte lokale Variablen unter FM
stets auf den Sender der Procedure zeigen, da
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  button1.OnClick(sender);
end;
button2 verschwinden läßt.

Danke soweit für eure Antworten, ich dachte dass nicht initialisierte Variablen
nirgendwo hinzeigen.

Gruß
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.173 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:06
Mir scheint es, dass nicht initialisierte lokale Variablen unter FM
stets auf den Sender der Procedure zeigen,
Der Compiler der die Anwendung erzeugt ist der gleiche. Was sollte da anders sein?

..., ich dachte dass nicht initialisierte Variablen nirgendwo hinzeigen.
Hätte Delphi eine Managed Framework/Garbage Collector dann wäre das so. Aber wenn man die Compilerwarnungen die bei sowas auftauchen auch nicht ignoriert dann behebt man die Programmierfehler auch.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:11
Der Compiler der die Anwendung erzeugt ist der gleiche. Was sollte da anders sein?
Unter VCL kommt eine Exception

Nur um das zu betonen, ich wollte das Verhalten verstehen, dass hier ein Programmierfehler vorliegt ist klar.
Gruß
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.173 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:32
Der Compiler der die Anwendung erzeugt ist der gleiche. Was sollte da anders sein?
Unter VCL kommt eine Exception
Das was anders kommst hast du ja geschrieben. Aber bei VCL und FM wird ja der gleiche Compiler genommen. Und auf dieser unteren ebene weiß der Compiler ja nichts mehr davon jetzt VCL oder FM vor sich zu haben. Also kann es eigentlich nur zufall sein was passiert.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.074 Beiträge
 
Delphi 12 Athens
 
#5

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 15:44
Ein Pointer ist auch nichts anderes als ein 4 oder 8 Byte großer Speicherbereich, dessen Inhalt als Speicheradresse (in diesem Fall einer TStringList-Instanz) interpretiert wird. Da bis zum Aufruf von sl.Free noch kein korrekter Inhalt in diesen Speicherbereich verbracht wurde (z.B. durch ein sl := TStringList.Create ), befinden sich darin eben noch die Bits, die irgendwie vorher von einem anderen Prozeduraufruf drin gestanden haben (z.B. dein Geburtsdatum oder die Größe deiner Festplatte oder die Speicheradresse von Button2).

Wenn man jetzt diesen zufälligen Speicherinhalt als Speicheradresse einer TStringList interpretiert, dann liegt diese Adresse mit hoher Wahrscheinlichkeit nicht im erlaubten Adressraum des aktuellen Prozesses und führt zu einer Schutzverletzung.

Wenn es sich aber zufällig um die Adresse von Button2 handelt, dann ist das sehr wohl eine gültige Adresse. Da Free für alle Objekt-Instanzen das selbe tut, führt der Aufruf von sl.Free in diesem Fall eben zur Freigabe von Button2.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#6

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 16:04
Mir scheint es, dass nicht initialisierte lokale Variablen unter FM
stets auf den Sender der Procedure zeigen, da... button2 verschwinden läßt.
Das ist wirklich merkwürdig, denn die lokale Variable liegt auf dem Stack ÜBER dem Wert von 'Sender'. Bin mir nicht sicher, aber da ist glaub ich auch noch eine Rücksprungadresse dazwischen.

'sl' zeigt also wirklich auf das, was vorher einmal auf dem Stack stand. vielleicht ist das ja der Button, nur liegt das dann nicht am Sender, sondern vermutlich an der Click-Verarbeitung der Button-Komponente.

Wenn sich hier nun die VCL und FM unterscheiden (wovon auszugehen ist), wäre das eine Erklärung
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.231 Beiträge
 
Delphi 12 Athens
 
#7

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 16:47
Delphi optimiert diese Objekt-variable weg.
Diese wird ja nur an einer Stelle verwendet, weswegen sie direkt in den Registern liegen kann.
z.B. in EAX
Jetzt kommt es darauf an, wofür vorher dieses EAX verwendet wurde
und schon hat man das in dieser Variable, was gerade in diesem EAX drinsteht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 03:02 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