次のコードはうまく動作しますが、そうではありません。 Button1をクリックすると、オブジェクトが最初に破棄され、その値が使用され、アクセス違反などが発生しなくなります...さらに、乗算演算によって正しい結果が得られ、Obj1
が破棄されないことが証明されます!しかし、もう一度、これはどちらも当てはまりません。なぜなら私がプログラムを閉じるとメモリリークを報告しないからです。私は非常に混乱しています。オブジェクトを破棄した後にオブジェクトを使用すると、例外が表示されないのはなぜですか?
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.
メモリがまだ有効なためです。その時点でメモリ位置に書き込んでいるだけです。あなたはその時点で他のオブジェクトの上に落書きしているかもしれません。 –