Delphi-Quellcode:
constructor TGrundklasse.Create(AStream: TStream);
begin
inherited Create;
end;
destructor TGrundklasse.Destroy;
begin
inherited;
end;
constructor TAbgeleiteteKlasse.Create;
begin
FStream := TMemoryStream.Create;
inherited Create(FStream);
end;
destructor TAbgeleiteteKlasse.Destroy;
begin
inherited; // Könnte ja auf den übergebenen Stream noch zugreifen.
FStream.Free;
end;
Destroy von TGrundklasse:
Code:
Unit1.pas.47: inherited;
0046491F 8BD3 mov edx,ebx
00464921 80E2FC and
dl,$fc
00464924 8BC6 mov eax,esi
00464926 E8B9F1F9FF call TObject.Destroy
Unit1.pas.48: end;
0046492B 84DB test bl,bl
0046492D 7E07 jle $00464936 // Springt um ClassDestroy herum.
0046492F 8BC6 mov eax,esi
00464931 E846F6F9FF call @ClassDestroy // Ruft FreeInstance auf.
00464936 5E pop esi
00464937 5B pop ebx
00464938 C3 ret
00464939 8D4000 lea eax,[eax+$00]
Richtig, ClassDestroy, was FreeInstance aufrufen wird, steht hier drin. ABER: Durch den bedingten Sprungbefehl
jle wird es hier
nicht aufgerufen!
Destroy von TAbgeleiteteKlasse:
Code:
Unit1.pas.58: inherited;
00464993 8BD3 mov edx,ebx
00464995 80E2FC and
dl,$fc
00464998 8BC6 mov eax,esi
0046499A E875FFFFFF call TGrundklasse.Destroy
Unit1.pas.59: FStream.Free;
0046499F 8B4604 mov eax,[esi+$04]
004649A2 E84DF1F9FF call TObject.Free
Unit1.pas.60: end;
004649A7 84DB test bl,bl
004649A9 7E07 jle $004649b2 // Springt nicht.
004649AB 8BC6 mov eax,esi
004649AD E8CAF5F9FF call @ClassDestroy // Ruft FreeInstance auf.
004649B2 5E pop esi
004649B3 5B pop ebx
004649B4 C3 ret
004649B5 8D4000 lea eax,[eax+$00]
@Neutral General:
Zwingt dich auch keiner zu, wenn
du schnell den Überblick verlierst. Aber falsch ist es immer noch nicht.
Danke Uwe, endlich mal jemand der auf meiner Seite steht