Sehr interessant. Das scheint wunderbar, selbst im TThread, zu funktionieren.
Warum war denn Finalize(Data^) falsch?
Ich habe mit mal den Code von Dispose rausgesucht:
Delphi-Quellcode:
procedure _Dispose(P: Pointer; TypeInfo: Pointer);
{$IFDEF PUREPASCAL}
begin
_Finalize(P, TypeInfo);
FreeMem(P);
end;
{$ELSE}
asm
{ -> EAX Pointer to object to be disposed }
{ EDX Pointer to type info }
{$IFDEF ALIGN_STACK}
SUB ESP, 8
{$ENDIF ALIGN_STACK}
PUSH EAX
CALL _Finalize
POP EAX
{$IFDEF ALIGN_STACK}
SUB ESP, 4
{$ENDIF ALIGN_STACK}
CALL _FreeMem
{$IFDEF ALIGN_STACK}
ADD ESP, 12
{$ENDIF ALIGN_STACK}
end;
{$ENDIF !PUREPASCAL}
Finalize ist wirklich vertreten, aber mit einer Bedingung verknüpft.
Und in der selben
Unit wird, wenn Dispose(P); aufgerufen wird, auch niemals Finalize aufgerufen.
Demnach scheint Finalize wirklich immer aufgerufen zu werden, wenn man Dispose aufruft.