Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

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

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