Hier ist das ausführlich erklärt - man muss es aber auch ganz lesen:
System.Finalize
Wichtig ist dabei folgende Sequenz:
Zitat:
Wenn auf eine dynamische Variable folgende Bedingungen zutreffen, ist ein Aufruf von Finalize erforderlich, um die Variable vor ihrer Deallozierung zu finalisieren.
Die Variable wird nicht mit der Standardprozedur Dispose (sondern z.B. mit FreeMem) freigegeben.
Die Variable enthält lange Strings, Varianten und Interfaces, die nicht alle leer sind bzw. den Wert Unassigned haben.
Es müssen beide Bedingungen zutreffen, also insbesondere die dynamische Erzeugung/Freigabe und dann auch nur wenn dabei kein New/Dispose verwendet wird.
Im konkreten Fall sind alle deklarierten Array-Variablen, die über SetLength oder ein Copy ihren Speicher bekommen, nicht davon betroffen, da der Compiler weiß was damit zu tun ist und den nötigen Aufräumcode entsprechend anlegt.
Ich kann mich nicht erinnern, wann ich das letzte Mal wirklich ein Finalize schreiben musste.