Stimmt, Free ist tatsächlich keine Klassenfunktion.
Free ist allerdings nicht virtuell, und DAS ist der Grund warum man statt
Delphi-Quellcode:
if self <> nil then
self.Free;
auch einfach
self.Free;
aufrufen kann, denn selbst wenn self = nil ist, findet der Compiler die Funktion Free, da sie nicht virtuell gelinkt wird, sondern statisch. Und Free prüft als erstes ob self = nil ist oder nicht.
Das Beispiel das ich oben geschrieben habe funktioniert (wie Christian schreibt) tatsächlich nur dann, wenn der Speicher noch nicht anderweitig überschrieben wurde, was einfach daran liegt dass nach dem ersten Free sl <> nil ist. Funktioniert also i.d.R. nicht, da davon ausgegangen werden muß, dass der Speicher in der Zwischenzeit überschrieben wurde.
Danke für die Korrektur, Christian, sonst hätte ich meine fehlerhafte Theorie im Kopf behalten.