Der folgende Code funktioniert gut, aber es sollte nicht! Wenn ich auf den Button1 klicke, wird das Objekt zuerst zerstört, und dann wird sein Wert verwendet und ich erhalte keine Zugriffsverletzung oder etwas ... Mehr noch, die Multiplikationsoperation gibt das korrekte Ergebnis, das beweist, dass Obj1
nicht zerstört wird ! Aber auch das ist nicht wahr, denn wenn ich das Programm schließe, meldet es keinen Speicherverlust. Ich bin sehr verwirrt.Warum erhalte ich keine Ausnahme, wenn ich das Objekt benutze, nachdem ich es zerstört habe?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
MyObj = class(TObject)
Value: Cardinal;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
public
Obj1:MyObj;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Obj1.Free;
Obj1.Value:=Obj1.Value * 5;
Caption:=IntToStr(Obj1.Value);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown:=true;
Obj1:=MyObj.Create;
Obj1.Value:=10;
end;
end.
Es ist, weil der Speicher noch gültig ist; Sie schreiben gerade an Speicherorte. Sie könnten zu diesem Zeitpunkt über andere Objekte kritzeln. –