![]() |
[FM] Free auf nil wird zu self.free
Hallo zusammen,
mir ist gerade etwas merkwürdiges unter FM aufgefallen. Folgender Beispielcode
Code:
Führt unter Firemonkey dazu, dass der Button freigegeben wird, unter VCL kommt es
procedure TForm1.btnTestClick(Sender: TObject);
var sl: TStringList; begin sl.Free; end; wie zu erwarten zu einer Exception. Kann mir jemand das Verhalten unter FM erklären, oder ist es ein Bug? Gruß |
AW: [FM] Free auf nil wird zu self.free
Zitat:
|
AW: [FM] Free auf nil wird zu self.free
Das wird Zufall sein.
Lokale Variablen werden nicht automatisch initialisiert. Es steht dort also ein "Zufallswert" drin. Und bei VM wird in der Speicheradresse, welche DU hast vergessen zu initialisieren, vielleicht "zufällig" die Button-Komponente drinstehn. Fazit: DU bist Schuld. [edit] :stupid: |
AW: [FM] Free auf nil wird zu self.free
Eine nicht initialisierte Stackvariable freizugeben ist der Bug.
Ob FM hier nur zufällig den Button abgelegt hat, oder ob es da ein System gibt kann ich nicht beurteilen. |
AW: [FM] Free auf nil wird zu self.free
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:
button2 verschwinden läßt.
procedure TForm1.Button1Click(Sender: TObject);
var sl: TStringList; begin sl.Free; end; procedure TForm1.Button2Click(Sender: TObject); begin button1.OnClick(sender); end; Danke soweit für eure Antworten, ich dachte dass nicht initialisierte Variablen nirgendwo hinzeigen. Gruß |
AW: [FM] Free auf nil wird zu self.free
Zitat:
Zitat:
|
AW: [FM] Free auf nil wird zu self.free
Zitat:
Nur um das zu betonen, ich wollte das Verhalten verstehen, dass hier ein Programmierfehler vorliegt ist klar.:duck: Gruß |
AW: [FM] Free auf nil wird zu self.free
Zitat:
|
AW: [FM] Free auf nil wird zu self.free
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
Delphi-Quellcode:
), 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).
sl := TStringList.Create
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
Delphi-Quellcode:
in diesem Fall eben zur Freigabe von Button2.
sl.Free
|
AW: [FM] Free auf nil wird zu self.free
Zitat:
'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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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