Und um alles noch mal zusammen zu fassen:
Dispose() braucht einen typisierten Pointer, damit es weiß, wie viel Speicher es freigeben muss. (Auf Delphisch: Dispose(PString(Datta); )
Enthält der Pointer lange Strings, Variant-Werte oder Interfaces, muss vorher ein Finalize gemacht werden. Vorsorglichg kann man das immer voranstellen, denn ...

Zitat von
... die Delphi-Hilfe ©Borland:
Enthält die als Parameter an Finalize übergebene Variable keine langen Strings, Varianten oder Schnittstelle entfernt der Compiler den Aufruf und generiert keinen Code.